TypedValue安卓自带的单位转换

在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了设置px的方法,例如setPadding,并没有提供设置dp的方法。这个时候,如果需要设置dp的话,就要将dp转换成px了
————————————————
将某单位转化为像素
public static float applyDimension(int unit, float value,DisplayMetrics metrics)方法

px : 像素(pixels),即屏幕上的像素点,1px代表占据一个像素点。
dp : 独立像素(device independent pixels),这是我们使用最多的一种单位,一般来说我们在布局文件中定义控件的宽高等属性时都会使用它。它是一种能够自动适应不同屏幕密度的单位,在160dpi的屏幕上,1dp = 1px。由于Android碎片化严重,使用它作为长度单位可以适配不同的屏幕密度。
sp : 比例像素(scaled pixels),我们定义字体大小的时候,一般都会使用sp作单位。sp除了能够像dp一样可以适应屏幕密度的变化,还可以随着系统字体的大小设置改变作出变化。如果产品经理不想文字随着手机设置中字体的大小发生改变(例如标题),可以使用dp代替。
in : 英寸(inch),屏幕的物理尺寸,1 inch = 2.54cm。
pt : 点(point,也是屏幕的物理尺寸,1 pt = 1/72 inch。
mm : 毫米(millimeter),后面三种都是物理尺寸,在Android开发中不常用。

/*
第一个参数是单位转换的,例如px->sp
第二参数是需要转换的值
第三个是设备屏幕参数.getDisplayMetrics()这个能获得屏幕的px
*/
 public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

举例:
将50dp转化为像素值
int ss=TypedValue.applyDimension(COMPLEX_UNIT_DIP,50,context.getResources().getDisPlayMetrics());

发布了16 篇原创文章 · 获赞 0 · 访问量 857

猜你喜欢

转载自blog.csdn.net/weixin_45830683/article/details/102998411