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,正好是四舍五入,这样就保证了咱们算出来的值相对精准。

  • 相关阅读:
    常见sql注入的类型
    sql-labs 18-20(sqlmap注入)
    sqli-labs11-17(手注+sqlmap)
    Android Zygote进程启动分析
    android点击桌面App图标activity启动流程
    Android启动过程
    android主线程ActivityThread
    mac上写c++
    Gradle发布项目到 maven 之novoda/bintray-release(3)
    Gradle发布项目到 maven 之gradle-bintray-plugin(2)
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152115.html
Copyright © 2011-2022 走看看