android 关于px转换成dp,sp的结论

最近看了很多px转换dp,sp的贴子,看到了很多种方法

    有通过安卓自带的工具类反向推导得出的工具类

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

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

    public static int sp2px(Context context, float spValue) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    public static int px2sp(Context context, float pxValue) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }
}

    也有通过UI设计图片的宽高像素和屏幕尺寸,结合公式计算出来的

    等等等等。。。。。。

   最后通过测量控件高度打印日志,发现这些方法都不准确

可以这样算:

    1、找UI问出作图时的宽和高的像素

    2、通过代码获取设备的密度、dpi和宽   

DisplayMetrics metrics = this.getResources().getDisplayMetrics();
        float density = metrics.density;            //屏幕密度
        int dpi = metrics.densityDpi;                //屏幕dpi
        int widthPixels = metrics.widthPixels;        //屏幕宽度

    3、dp = (UI标的px / UI作图的宽度)* 设备的宽度 / 屏幕密度

举个例子:    UI作图时是以1024*768为准做的图,我的设备是1920*1200的,屏幕密度是2.25,dpi是360

                   UI标注图里有个控件宽高都是100px,那么

                   100 / 768 * 1200 / 2.25 = 69.444

                    所以我就可以写69.444 dp

但是!!!

     如果换个设备呢,换成2048*1536的,屏幕密度和dpi都换了,那69.444肯定就不合适了,改怎么办呢?不要急。。。

     这就用到了最小屏幕宽度,最小屏幕宽度的单位是dp,那最小屏幕宽度怎么计算呢?

最小屏幕宽度  dp = 160 * 屏幕宽度 / dpi

     还拿我上面那个例子来看,我的设备的最小屏幕宽度就是

    160 * 1200 / 360 = 533.333 dp

     所以我可以在res下面建个文件夹 values-sw533dp   或者  values-sw530dp,只要小于等于算出来的最小屏幕宽度就行,为什么要小于等于最小屏幕宽度呢?因为系统是从大到小。。。扫描吧。。如果建的文件夹是 values-sw550dp ,设备的只有553.333,达不到550,就会自动进入小一级的,如果已经是最小的了就会用系统默认的values文件夹内的内容


    建好文件夹后在下面建个dimen.xml的文件,内容大致为

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px10_sp">9.856sp</dimen>
    <dimen name="px11_sp">10.841sp</dimen>
    <dimen name="px12_sp">11.827sp</dimen>
    <dimen name="px13_sp">12.813sp</dimen>
    <dimen name="px14_sp">13.798sp</dimen>
    <dimen name="px15_sp">14.784sp</dimen>
</resources>
可以用我写好的方法:
        int width = 1200;//ui作图的屏幕宽度

        DisplayMetrics metrics = this.getResources().getDisplayMetrics();
        float density = metrics.density;            //设备密度
        int dpi = metrics.densityDpi;               //设备dpi
        int widthPixels = metrics.widthPixels;      //设备宽度

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
        for (int px = 0; px <= 200; px += 2) {
            String dp = px * 1.0 * widthPixels / width / density + "";
            if (dp.indexOf(".") + 4 < dp.length()) {//保留3位小数
                dp = dp.substring(0, dp.indexOf(".") + 4);
            }
            stringBuilder.append("<dimen name=\"px").append(px + "").append("_dp\">").append(dp).append("dp</dimen>\n");
        }
        stringBuilder.append("</resources>");
        Log.e("tag", stringBuilder.toString());
打印出来结果是
                                                         <?xml version="1.0" encoding="utf-8"?>
                                                         <resources>
                                                         <dimen name="px0_dp">0.0dp</dimen>
                                                         <dimen name="px2_dp">0.888dp</dimen>
                                                         <dimen name="px4_dp">1.777dp</dimen>
                                                         <dimen name="px6_dp">2.666dp</dimen>
                                                         <dimen name="px8_dp">3.555dp</dimen>
                                                         <dimen name="px10_dp">4.444dp</dimen>
                                                         <dimen name="px12_dp">5.333dp</dimen>
                                                         <dimen name="px14_dp">6.222dp</dimen>
                                                         <dimen name="px16_dp">7.111dp</dimen>
                                                         <dimen name="px18_dp">8.0dp</dimen>
                                                         <dimen name="px20_dp">8.888dp</dimen>
                                                         <dimen name="px22_dp">9.777dp</dimen>
                                                         <dimen name="px24_dp">10.666dp</dimen>
                                                         <dimen name="px26_dp">11.555dp</dimen>
                                                         <dimen name="px28_dp">12.444dp</dimen>
                                                         <dimen name="px30_dp">13.333dp</dimen>
                                                         <dimen name="px32_dp">14.222dp</dimen>
                                                         <dimen name="px34_dp">15.111dp</dimen>
                                                         <dimen name="px36_dp">16.0dp</dimen>
                                                         <dimen name="px38_dp">16.888dp</dimen>
                                                         <dimen name="px40_dp">17.777dp</dimen>
                                                         <dimen name="px42_dp">18.666dp</dimen>
                                                         <dimen name="px44_dp">19.555dp</dimen>
                                                         <dimen name="px46_dp">20.444dp</dimen>
                                                         <dimen name="px48_dp">21.333dp</dimen>
                                                         <dimen name="px50_dp">22.222dp</dimen>
                                                         <dimen name="px52_dp">23.111dp</dimen>
                                                         <dimen name="px54_dp">24.0dp</dimen>
                                                         <dimen name="px56_dp">24.888dp</dimen>
                                                         <dimen name="px58_dp">25.777dp</dimen>
                                                         <dimen name="px60_dp">26.666dp</dimen>
                                                         <dimen name="px62_dp">27.555dp</dimen>
                                                         <dimen name="px64_dp">28.444dp</dimen>
                                                         <dimen name="px66_dp">29.333dp</dimen>
                                                         <dimen name="px68_dp">30.222dp</dimen>
                                                         <dimen name="px70_dp">31.111dp</dimen>
                                                         <dimen name="px72_dp">32.0dp</dimen>
                                                         <dimen name="px74_dp">32.888dp</dimen>
                                                         <dimen name="px76_dp">33.777dp</dimen>
                                                         <dimen name="px78_dp">34.666dp</dimen>
                                                         <dimen name="px80_dp">35.555dp</dimen>
                                                         <dimen name="px82_dp">36.444dp</dimen>
                                                         <dimen name="px84_dp">37.333dp</dimen>
                                                         <dimen name="px86_dp">38.222dp</dimen>
                                                         <dimen name="px88_dp">39.111dp</dimen>
                                                         <dimen name="px90_dp">40.0dp</dimen>
                                                         <dimen name="px92_dp">40.888dp</dimen>
                                                         <dimen name="px94_dp">41.777dp</dimen>
                                                         <dimen name="px96_dp">42.666dp</dimen>
                                                         <dimen name="px98_dp">43.555dp</dimen>
                                                         <dimen name="px100_dp">44.444dp</dimen>
                                                         <dimen name="px102_dp">45.333dp</dimen>
                                                         <dimen name="px104_dp">46.222dp</dimen>
                                                         <dimen name="px106_dp">47.111dp</dimen>
                                                         <dimen name="px108_dp">48.0dp</dimen>
                                                         <dimen name="px110_dp">48.888dp</dimen>
                                                         <dimen name="px112_dp">49.777dp</dimen>
                                                         <dimen name="px114_dp">50.666dp</dimen>
                                                         <dimen name="px116_dp">51.555dp</dimen>
                                                         <dimen name="px118_dp">52.444dp</dimen>
                                                         <dimen name="px120_dp">53.333dp</dimen>
                                                         <dimen name="px122_dp">54.222dp</dimen>
                                                         <dimen name="px124_dp">55.111dp</dimen>
                                                         <dimen name="px126_dp">56.0dp</dimen>
                                                         <dimen name="px128_dp">56.888dp</dimen>
                                                         <dimen name="px130_dp">57.777dp</dimen>
                                                         <dimen name="px132_dp">58.666dp</dimen>
                                                         <dimen name="px134_dp">59.555dp</dimen>
                                                         <dimen name="px136_dp">60.444dp</dimen>
                                                         <dimen name="px138_dp">61.333dp</dimen>
                                                         <dimen name="px140_dp">62.222dp</dimen>
                                                         <dimen name="px142_dp">63.111dp</dimen>
                                                         <dimen name="px144_dp">64.0dp</dimen>
                                                         <dimen name="px146_dp">64.888dp</dimen>
                                                         <dimen name="px148_dp">65.777dp</dimen>
                                                         <dimen name="px150_dp">66.666dp</dimen>
                                                         <dimen name="px152_dp">67.555dp</dimen>
                                                         <dimen name="px154_dp">68.444dp</dimen>
                                                         <dimen name="px156_dp">69.333dp</dimen>
                                                         <dimen name="px158_dp">70.222dp</dimen>
                                                         <dimen name="px160_dp">71.111dp</dimen>
                                                         <dimen name="px162_dp">72.0dp</dimen>
                                                         <dimen name="px164_dp">72.888dp</dimen>
                                                         <dimen name="px166_dp">73.777dp</dimen>
                                                         <dimen name="px168_dp">74.666dp</dimen>
                                                         <dimen name="px170_dp">75.555dp</dimen>
                                                         <dimen name="px172_dp">76.444dp</dimen>
                                                         <dimen name="px174_dp">77.333dp</dimen>
                                                         <dimen name="px176_dp">78.222dp</dimen>
                                                         <dimen name="px178_dp">79.111dp</dimen>
                                                         <dimen name="px180_dp">80.0dp</dimen>
                                                         <dimen name="px182_dp">80.888dp</dimen>
                                                         <dimen name="px184_dp">81.777dp</dimen>
                                                         <dimen name="px186_dp">82.666dp</dimen>
                                                         <dimen name="px188_dp">83.555dp</dimen>
                                                         <dimen name="px190_dp">84.444dp</dimen>
                                                         <dimen name="px192_dp">85.333dp</dimen>
                                                         <dimen name="px194_dp">86.222dp</dimen>
                                                         <dimen name="px196_dp">87.111dp</dimen>
                                                         <dimen name="px198_dp">88.0dp</dimen>
                                                         <dimen name="px200_dp">88.888dp</dimen>
                                                         </resources>

到这里解决了px转换为dp的问题了,px转换为sp和这个方法一样,只是把dp改为sp就行了

做不同屏幕的适配就需要知道那个屏幕的宽度、屏幕密度、屏幕dpi,然后套用这个方法就行了。

猜你喜欢

转载自blog.csdn.net/pxcz110112/article/details/80408694