Android之TypedValue.applyDimension()方法的使用

TypedValue是一个工具类,他是一个动态容器。具体是做什么用这里不作介绍了。

主要是要了解applyDimension(int unit, float value,DisplayMetrics metrics)方法的使用

先看看该方法的参数表示:

applyDimension(int unit, float value,DisplayMetrics metrics)

参数1:表示单位,其常用单位有如下表示(COMPLEX_UNIT_PX 、COMPLEX_UNIT_DIP、COMPLEX_UNIT_SP、COMPLEX_UNIT_PT、COMPLEX_UNIT_IN、COMPLEX_UNIT_MM )

参数2:表示单位对应值的大小

参数3:封装了显示区域的各种属性值

然后看一下源码:

 /**
     * Converts an unpacked complex data value holding a dimension to its final floating 
     * point value. The two parameters <var>unit</var> and <var>value</var>
     * are as in {@link #TYPE_DIMENSION}.
     *  
     * @param unit The unit to convert from.
     * @param value The value to apply the unit to.
     * @param metrics Current display metrics to use in the conversion -- 
     *                supplies display density and scaling information.
     * 
     * @return The complex floating point value multiplied by the appropriate 
     * metrics depending on its unit. 
     */
    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;
    }

有上面我们可以看出,该方法最主要的功能就是将我们所对应的单位的值转换成屏幕上实际显示的像素(px)值

dp -> px
sp -> px
pt -> px
in -> px
mm -> px

上面所有单位的值,我们都可以通过该方法转换成对应的屏幕上显示的实际像素值

由于上面的方法只能将其他单位转换成px单位,下面介绍下具体的
dp -> px
px -> dp
sp -> px
px -> sp

    //转换dp为px 
    public static int convertDipToPx(Context context, int dip) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
    }

    //转换px为dp 
    public static int convertPxToDip(Context context, int px) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (px / scale + 0.5f * (px >= 0 ? 1 : -1));
    }
    //转换sp为px
    public static int spTopx(Context context, float spValue) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }
    //转换px为sp
    public static int pxTosp(Context context, float pxValue) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐