react

Android屏幕密度适配问题之px,dp,sp等详细介绍

2018-05-09  本文已影响67人  eagerabu

一  ,android屏幕相关知识

         屏幕大小指屏幕对角线的长度,使用“寸”度量,如4.7寸手机

         分 辨  率:分辨率指手机屏幕的像素点个数,如720*1280 指屏幕宽有720个像素点,高有1280个像素点

         PPI每英寸像素:Pixels per Inch 又称为DPI(Dots Per Inch),即屏幕密度,由对角线像素点数除以屏幕大小 得到,通常达到400PPI已经是非常高的屏幕密度

问题:假如要在界面上显示一个长度为100px的线段,在分辨率为320*480的手机上,屏幕密度为160,分辨率为480*800屏幕上屏幕密度为240单位长度内像素点比屏幕密度为160的多,同样100像素在

在两个不同分辨率屏幕上显示的长度就会不同,那么如何解决这个问题呢?为了能够在不同屏幕上得到相同长度的线段,我们改为dp作为线段长度单位

 独立像素密度dp:density-independent pixel(密度无关像素)各种屏幕密度不同导致同样像素大小的长度,在不同密度的屏幕上的显示长度不同,相同长度的屏幕高密度屏幕包含更多像素点,android 系统使用mdpi即密度值为160的屏幕作为标准,在这个屏幕上1px=1dp,因此我们可以使用不同密度的比例计算出对应屏幕的px与dp比例关系。

关系推导 :对于屏幕密度为160的屏幕,1px=1dp, 100dp=100px, 那么对于像素密度为240的屏幕100dp表示多少px?

    160              1dp=1px

    240               1dp=? px                                                              

 160/240=2/3 得出像素密度为240屏幕上1dp=3/2 px所以100dp的长度在像素密度为160的屏幕用100个像素点表示,而在像素密度为240的屏幕上用150像素点表示因此高密度屏幕上并不会缩短而显示长度一样 按此关系可以得到一个比例  ldpi  :  mdpi  :  hdpi  :  xhdpi : xxhdpi=3:4:6:8:12

谷歌官方提供了一个 换算公式 :px=dp*(dpi/160) 

下面是《android群英传》一书提供的封装好的转换工具类

public class DisplayUtils{

  /**

    * convert px to its equivalent dp

    *

    *将px转换为与之相等的dp

    */

    public static int px2dp(Context context, float pxValue) {

        final floatscale = context.getResources().getDisplayMetrics().density;

        return (int) (pxValue / scale + 0.5f);

    }

    /**

    * convert dp to its equivalent px

    *

    *将dp转换为与之相等的px

    */

    public static int dp2px(Context context, float dipValue) {

        final float scale =

context.getResources().getDisplayMetrics().density;

        return (int) (dipValue * scale + 0.5f);

    }

    /**

      * convert px to its equivalent sp

      *将px转换为sp

    */

    public static int px2sp(Context context, float pxValue) {

      final float fontScale =context.getResources().getDisplayMetrics().scaledDensity;

        return (int) (pxValue / fontScale+ 0.5f);

    }

    /**

    * convert sp to its equivalent px

    *

    *将sp转换为px

    */

    public static int sp2px(Context context, float spValue) {

        final float fontScale =context.getResources().getDisplayMetrics().scaledDensity;

        return (int) (spValue * fontScale+ 0.5f);

    }

}

接下来再说说sp: scaled pixels(放大像素). 主要用于字体显示best for

textsize。根据google 的推荐TextView的字号最好使用sp 做单位,使用sp当用户字体设置发生改变时,字体可以自动调整。

最后由于本人水平有限,在此只是做一下简单总结,如有错误欢迎指出

强烈推荐官网学习

谷歌官方对屏幕适配的介绍

上一篇 下一篇

猜你喜欢

热点阅读