Android自定义View(二)屏幕尺寸信息和单位转换

相关术语:

屏幕大小:通常描述手机大小会用几寸来描述,如6.5寸手机,这里的屏幕大小实际指的是屏幕对角线的长度;

分辨率:手机屏幕的像素点个数,如手机屏幕分辨率为1920x1080指的是宽有1080个像素点,高有1920个像素点;

DPI:每英寸像素,由对角线的像素点个数除以屏幕大小(对角线长度)得到;

px:像素,1px代表屏幕上一个物理的像素点,可以理解为绝对尺寸,在某个屏幕分辨率上显示一个长度值,到了另一个屏幕分辨率还是同一个长度值,一般不使用这个单位,因为会造成同一尺寸在不同分辨率显示不同的效果;

dp:设备无关像素,这个是谷歌为了解决px不适配屏幕的问题而引入的,可以理解为相对尺寸,在某个屏幕分辨率上显示一个长度值,该长度占屏幕多少比例,那么到了另一个屏幕分辨率就会调整相应的长度值确保长度占屏幕的比例是一样的,建议使用这个单位,它解决了同一数值在不同屏幕分辨率上显示相同尺寸大小的问题;

dip:dip和dp的效果完全一样,名称不同而已;

sp:与缩放无关的抽象像素,主要用于设置字体尺寸,和dp非常相似,区别在于使用sp作为字体大小单位,会随着系统的字体大小改变(Android系统允许用户自定义文字尺寸大小,如小、正常、大、超大等),而dp作为单位则不会,因此文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位。

屏幕密度对照表

密度ldpimdpihdpixhdpixxhdpi
DPI(密度值)120160240320480
分辨率240 x 320320 x 480480 x 800720 x 12801080 x 1920

其中dp和px的转换公式为:dp x DPI / 160 = px;

ldpi : mdpi : hdpi : xhdpi : xxhdpi = 3 : 4 : 6 : 8 : 12,也就是说在mdpi上1dp=1px,在hdpi上1dp=1.5px,在xhdpi上1dp=2px,在xxhdpi上1dp=3px。

单位转换

public class SizeUtil {
    //px转换为dp
    public static int px2dp(Context context, float pxValue) {
        float density = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / density + 0.5f);
    }

    //dp转换为px
    public static int dp2px(Context context, float dpValue) {
        float density = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * density + 0.5f);
    }

    //px转换为sp
    public static int px2sp(Context context, float pxValue) {
        float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / scaledDensity + 0.5f);
    }

    //sp转换为px
    public static int sp2px(Context context, float spValue) {
        float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * scaledDensity + 0.5f);
    }
}

      上面的代码中每个公式都会加上0.5f,这是为了进行四舍五入,减小误差,比如计算得到1.1和1.9的数值,更接近的取整应该是1和2,但是int强制转换会把小数点后的数字直接去掉,因此1.1和1.9的取整都是1。如果加上0.5,1.1加上0.5后取整还是1,1.9加上0.5是2.4,取整后是2,这样就更加贴近原数值。

      下一节将介绍Android中自定义属性AttributeSet的使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值