Android开发系列之屏幕密度和单位转换

【Android开发系列之屏幕密度和单位转换】欠伸展肢体,吟咏心自愉。这篇文章主要讲述Android开发系列之屏幕密度和单位转换相关的知识,希望能为你提供帮助。
      由于android的开源性,所以目前市面上面Android手机的分辨率特别多,这样的话就给我适配带来了一定的难度。要想做好适配,我们首先应该明白什么是分辨率、PPI、屏幕大小等概念,还有在不同的屏幕密度下,各个单位之间的转换关系。
      屏幕大小指屏幕对角线的长度,通常使用“寸”来度量。
      分辨率是指手机屏幕的像素点个数,例如720X1280就是指屏幕的宽有720个像素点,而高有1280个像素点。
      DPI每英寸像素,它是由对角线的像素点数除以屏幕的大小得到的。所以屏幕的密度对应关系为:

Android开发系列之屏幕密度和单位转换

文章图片
,正是由于各种屏幕密度的不同,导致同样像素大小的长度,在不同密度的屏幕上显示长度不同。
        Android系统使用mdpi即密度值为160的屏幕作为标准,在这个屏幕上1px=1dp。其他屏幕则可以通过比例进行换算,在mdpi中1dp=1px,在hdpi中1dp=1.5px,在xhdpi中1dp=2px,在xxxhdpi中1dp=3px。由此我们可以得到各个分辨率直接的换算比例,ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12。
        下面提供各个单位之间的转换代码:
public class DisplayUtil{public static int px2dip(Context context,float pxValue){ final float scale=context.getResources().getDisplayMetrics().density; return (int)(pxValue/scale+0.5f); }public static int dip2px(Context context,float dipValue){ final float scale=context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale +0.5f); }public static int px2sp(Context context,float pxValue){ final float scale=context.getResources().getDisplayMetrics().density; return (int)(pxValue/fontScale +0.5f); }public static int sp2px(Context context,float pxValue){ final float scale=context.getResources().getDisplayMetrics().density; return (int)(pxValue*fontScale +0.5f); } }

其中density就是前面所说的换算比例,同时,系统也提供了TypedValue类帮助我们转换,代码示例如下:
protected int dp2px(int dp){ return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,getResources().getDisplayMetrics()); }protected int sp2px(int sp){ return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,getResources().getDisplayMetrics()); }



    推荐阅读