Android中px、dp、sp以及drawable、mip-map目录
本文目的:使读者深入理解及快速使用(代码复制即可用)
px、dp、sp
【px】:px就是pixel的缩写,pixel即像素,比如我们通常说的手机分辨列表800*400都是px的单位。
【dp】:dip,Density-independent pixel, 是安卓开发用的长度单位,1dp表示在屏幕像素点密度为160ppi时1px长度 【sp】:scale-independent pixel,安卓开发用的字体大小单位。dp与px(dpi)之间关系
首先需要了解dpi
【dpi】:dot per inch(点每英寸),就是计算机屏幕上每英寸可以显示的像素点的数量。即:像素/英寸【dp的长度是什么?】:为了便于屏幕适配,安卓的长度单位需与设备的物理长度相关,由此引入了dp。160dp=1inch。即:160dp对应实际设备的物理长度1英寸。使用dp能达到不同dpi设备上长度一致的效果。
【dp与dpi关系】由dp的长度可知,对于160dpi设备,1dp=1px;对于320dpi设备,1dp=2px。
【dp与px换算】 1dp =(屏幕ppi/ 160)px
(注:为了方便计算,不同设备在此基础上会做一定偏移。例330dpi的设备,计算1dp=2.0625px,实际运行时可能为1dp=2px) 相关API: context.getResources().getDisplayMetrics().density =(屏幕ppi/ 160)sp与dp之间关系
dp和sp都是安卓的开发单位,dp是长度单位,sp是字体单位。sp与dp类似,正常情况1sp=1dp,但是可以根据用户的字体大小首选项进行缩放。Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),缩放之后sp与px/dp换算会相应变化。
如果app字体需跟随系统字体大小,则字体大小需使用sp。drawable、mip-map目录
drawable目录对应关系
- ldpi --->约120dpi:0.75倍图
- mdpi --->约160dpi:1倍图
- hdpi --->约240dpi :1.5倍图
- xhdpi --->约320dpi:2倍图
- xxhdpi --->约480dpi:3倍图
- xxxhdpi--->约640dpi:4倍图(add Api18,只用于启动图标)
mip-map目录
参考资料介绍:目前只用于优化启动图标
px、dp、sp转换代码(复制即可用)
public class DisplayUtils { /** * convert px to its equivalent dp * * 将px转换为与之相等的dp */ public static int px2dp(Context context, float pxValue) { final float scale = 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); }}