在安卓代码中dp 和 sp 换算px

    /** 
     * 单位转换工具 
     *  
     * @author carrey 
     *  
     */  
    public class DisplayUtil {  
        /** 
         * 将px值转换为dip或dp值,保证尺寸大小不变 
         *  
         * @param pxValue 
         * @param scale 
         *            (DisplayMetrics类中属性density) 
         * @return 
         */  
        public static int px2dip(float pxValue, float scale) {  
            return (int) (pxValue / scale + 0.5f);  
        }  
      
        /** 
         * 将dip或dp值转换为px值,保证尺寸大小不变 
         *  
         * @param dipValue 
         * @param scale 
         *            (DisplayMetrics类中属性density) 
         * @return 
         */  
        public static int dip2px(float dipValue, float scale) {  
            return (int) (dipValue * scale + 0.5f);  
        }  
      
        /** 
         * 将px值转换为sp值,保证文字大小不变 
         *  
         * @param pxValue 
         * @param fontScale 
         *            (DisplayMetrics类中属性scaledDensity) 
         * @return 
         */  
        public static int px2sp(float pxValue, float fontScale) {  
            return (int) (pxValue / fontScale + 0.5f);  
        }  
      
        /** 
         * 将sp值转换为px值,保证文字大小不变 
         *  
         * @param spValue 
         * @param fontScale 
         *            (DisplayMetrics类中属性scaledDensity) 
         * @return 
         */  
        public static int sp2px(float spValue, float fontScale) {  
            return (int) (spValue * fontScale + 0.5f);  
        }  
    }  




获取密度比例方法


static public float getScreenDensity(Context context) {
    try {
        DisplayMetrics dm = new DisplayMetrics();

        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getMetrics(dm);
        return dm.density;
    } catch (Exception e) {
        return DisplayMetrics.DENSITY_DEFAULT;
    }
}



//获取屏幕密度

 getResources().getDisplayMetrics().densityDpi


 

原理解释:

ppi的运算方式是:

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

dp:Density-independent pixels,以160PPI屏幕为标准,则1dp=1px,

dp和px的换算公式 :
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。

 

sp:Scale-independent pixels,它是安卓的字体单位,以160PPI屏幕为标准,当字体大小为 100%时, 1sp=1px。

sp 与 px 的换算公式:sp*ppi/160 = px

为什么是160原因: 谷歌做标准 我个人觉得好算吧.以前好像还是140是因为以前手机屏幕小

也就是说

dm.density=getResources().getDisplayMetrics().densityDpi/160

至于为什么要加0.5

(dipValue * scale + 0.5f)
(以下博文转载http://blog.csdn.net/changcsw/article/details/52440543)

这两个公式网上很多,但为什么 最后都要加上0.5f 呢?

 按正常的推理应该是  dip = pxValue / scale 和 px = dipValue * scale ,

实际上准确的值就应该是 咱们推理出来的,之所以后面加上0.5f是因为 咱们要的只不是那么精准,根据推理算出来的是个浮点数,而咱们程序中一般使用int类型就够了,这里涉及到一个类型转换精准度问题,熟悉Java特效的同学应该知道

float 类型的 4.1 和4.9 强转成int类型后,会失去精准度变成 int类型的4, 而如果咱们想四舍五入的话,把他们都加上0.5f,这样转换出来的结果就是:

4.4 + 0.5 = 4.9 转为int 还是4,而4.5 + 0.5 = 5.0 转换成int后就是5,正好是四舍五入,这样就保证了咱们算出来的值相对精准。

posted on 2016-11-03 09:34  木鱼哥  阅读(521)  评论(0编辑  收藏  举报

导航