关于android尺寸单位换算

来源:互联网 发布:mac版围棋对弈软件 编辑:程序博客网 时间:2024/05/17 08:48

      今天看到经常用的一个dp转px的方法

public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}

     计算的最后都加0.5f,这是为什么呢,于是在网上搜索一番发现千篇一律的dp转px方法都写成这样,至于为什么也没有说明,于是翻看View的源码,在构造函数中对xml文件中的参数进行初始化,对于padding之类的尺寸的值的处理用到了这么一个方法

public static int complexToDimensionPixelSize(int data,            DisplayMetrics metrics)    {        final float value = complexToFloat(data);        final float f = applyDimension(                (data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,                value,                metrics);        final int res = (int)(f+0.5f);        if (res != 0) return res;        if (value == 0) return 0;        if (value > 0) return 1;        return -1;    }
这是TypedValue中的一个方法

同样的在这个类中,发现了另一个方法

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;    }
Converts an unpacked complex data value holding a dimension to its final floating point value

将一个含有尺寸的没有包装的数据转换成一个浮点型的值

这两个方法的区别就是返回值的不同一个是int一个是float,根据自己的理解,applyDimension这个方法返回的换算结果更为精准,但是有时可能需要int型的数值,这时,如果用这个方法返回了一个float型0.x的数值转成int型时就会变成0,所以需要+0.5f,防止0的出现

0 0
原创粉丝点击