一个像素转换工具类的实现——dp,px,sp之间的相互转换

来源:互联网 发布:12377网络举报有用吗 编辑:程序博客网 时间:2024/05/22 14:20

什么是dp,px,sp

  • dp :在Android中dp(也即dip,device independent pixels,设备独立像素),一个基于density的抽象单位,不依赖于像素,推荐使用。当densityDip=160时,1dp=1px。

  • px:pixels(像素),即就是屏幕的像素点。

  • sp:同dp相似,但还会根据用户的字体大小偏好来缩放(一般建议使用sp作为文本的单位,其它用dp)

dip介绍

  • QVGA: density=0.75(120/160) densityDpi=120 QVGA(240*320)
  • HVGA:density=1.0(160/160) densityDpi=160 HVGA(320*480)
  • WVGA:density = 1.5(240/160) densityDpi=240 WVGA(480*800)
  • WQVGA:density=2.0 densityDpi=120 WQVGA(240*400)

densityDip值表示每英寸有多少个显示点

我们一般在项目中会定义多个适配资源文件夹(values-XXX,drawable-XXX等)

  • drawable-ldpi: 屏幕密度为120的手机设备
  • drawable-mdpi: 屏幕密度为160的手机设备(此为baseline,其他均以此为基准,在此设备上,1dp = 1px)
  • drawable-hdpi: 屏幕密度为240的手机设备
  • drawable-xhdpi: 屏幕密度为320的手机设备
    drawable-xxhdpi:屏幕密度为480的手机设备

dp与px之间相互转换

1.dp与px的换算公式:

dips=(pixs*160)/densityDpi
pixs =dips * (densityDpi/160)

2.dp与px的代码实现:

注意在代码里面进行转化的时候还需要有一个偏移值:0.5f

    /**     * dp转 px.     *     * @param dipValue      * @return the int     */    public static int dp2px(float dipValue) {        final float scale = mContext.getResources().getDisplayMetrics().densityDpi;        return (int) (dipValue * (scale / 160) + 0.5f);    }   /**     * px转dp.     *     * @param pxValue      * @return the int     */    public static int px2dp(float pxValue) {        final float scale = mContext.getResources().getDisplayMetrics().densityDpi;        return (int) ((pxValue * 160) / scale + 0.5f);    }

sp与px转换

   /**     * sp转px.     *     * @param spValue the value     * @return the int     */    public static int sp2px(float spValue ) {        Resources r;        if (mContext == null) {            r = Resources.getSystem();        } else {            r = mContext.getResources();        }        float pxValue = spValue * r.getDisplayMetrics().scaledDensity;        return (int) (pxValue + 0.5f);    }/**     * px转sp.     *     * @param pxValue the value     * @return the int     */    public static int px2sp(float pxValue) {        final float scale = mContext.getResources().getDisplayMetrics().scaledDensity;        return (int) (pxValue / scale + 0.5f);    }

关于什么是ppi

PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数

e.g. iphone5的ppi是多少?ppi=√(1136px² + 640px²)/4 in=326ppi(视网膜Retina屏).

0 0
原创粉丝点击