首页 > 代码库 > Android开发系列之屏幕密度和单位转换
Android开发系列之屏幕密度和单位转换
由于Android的开源性,所以目前市面上面Android手机的分辨率特别多,这样的话就给我适配带来了一定的难度。要想做好适配,我们首先应该明白什么是分辨率、PPI、屏幕大小等概念,还有在不同的屏幕密度下,各个单位之间的转换关系。
屏幕大小指屏幕对角线的长度,通常使用“寸”来度量。
分辨率是指手机屏幕的像素点个数,例如720X1280就是指屏幕的宽有720个像素点,而高有1280个像素点。
DPI每英寸像素,它是由对角线的像素点数除以屏幕的大小得到的。所以屏幕的密度对应关系为:,正是由于各种屏幕密度的不同,导致同样像素大小的长度,在不同密度的屏幕上显示长度不同。
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()); }
Android开发系列之屏幕密度和单位转换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。