zoukankan      html  css  js  c++  java
  • 在安卓代码中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,正好是四舍五入,这样就保证了咱们算出来的值相对精准。

  • 相关阅读:
    解决Docker时区与主机时区不一致的问题
    删除k8s中一直处于Terminating的资源
    多块盘制作成一个lvm
    Docker mysql启动自动按顺序导入sql
    linux中nfs启动报rpcbind.socket failed to listen on sockets: Address family not supported by protocol
    k8s容器挂载配置文件
    ssh到远程执行命令并返回
    安全组
    Python 字符串操作函数二
    Python 字符串操作函数一
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152115.html
Copyright © 2011-2022 走看看