概念
屏幕尺寸
按屏幕对角测量的实际物理尺寸。
为简便起见,Android 将所有实际屏幕尺寸分组为四种通用尺寸:小、 正常、大和超大。
屏幕密度
屏幕物理区域中的像素量;通常称为 dpi(每英寸 点数)。例如, 与“正常”或“高”密度屏幕相比,“低”密度屏幕在给定物理区域的像素较少。
为简便起见,Android 将所有屏幕密度分组为六种通用密度: 低、中、高、超高、超超高和超超超高。
方向
从用户视角看屏幕的方向,即横屏还是 竖屏,分别表示屏幕的纵横比是宽还是高。请注意, 不仅不同的设备默认以不同的方向操作,而且 方向在运行时可随着用户旋转设备而改变。
分辨率
屏幕上物理像素的总数。添加对多种屏幕的支持时, 应用不会直接使用分辨率;而只应关注通用尺寸和密度组指定的屏幕 尺寸及密度。
密度无关像素 (dp)
在定义 UI 布局时应使用的虚拟像素单位,用于以密度无关方式表示布局维度 或位置。
密度无关像素等于 160 dpi 屏幕上的一个物理像素,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。
常用单位
- px:pixel,像素,电子屏幕上组成一幅图画或照片的最基本单元
- pt: point,点,印刷行业常用单位,等于1/72英寸
- ppi: pixel per inch,每英寸像素数,该值越高,则屏幕越细腻
- dpi: dot per inch,每英寸多少点,该值越高,则图片越细腻
- dp: dip,Density-independent pixel, 是安卓开发用的长度单位,1dp表示在屏幕像素点密度为160ppi时1px长度
- sp: scale-independent pixel,安卓开发用的字体大小单位。
注:字体的大小用也有用dp的,看需求。
注:不同的方法单位不同。TextView.setTextSize()默认是单位是sp,TextView.setPadding()默认是px。
转换
public class DisplayUtil {
/**
* 将px值转换为dip或dp值,保证尺寸大小不变
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将dip或dp值转换为px值,保证尺寸大小不变
*
* @return
*/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}
转换的原理
Dimension
1.最低4位为单位
2.4-7位为radix
3.其他的24位为数值
比如10dp
六种通用的密度
ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi |
---|---|---|---|---|---|
120px | 160dpi(基准) | 240dpi | 360dpi | 480dpi | 640dpi |
3 | 4 | 6 | 8 | 12 | 16 |
240*320 | 320*480 | 480*800 | 720*1280 | 1080*1920 |
图标大小
Launcher Icons
Menu Icons
ldpi (120 dpi) | mdpi (160 dpi) | hdpi (240 dpi) | xhdpi (320 dpi) | xxhdpi (480 dpi) | xxxhdpi (640 dpi) |
---|---|---|---|---|---|
36px | 48px | 72px | 96px | 144px | 192px |
Action Bar Icons
Status Bar Icons
ldpi (120 dpi) | mdpi (160 dpi) | hdpi (240 dpi) | xhdpi (320 dpi) | xxhdpi (480 dpi) | xxxhdpi (640 dpi) |
---|---|---|---|---|---|
18px | 24px | 36px | 48px | 72px | 96px |
drawable和mipmap区别
- mipmap放ic_launcher图标
- drawable放其他的图片文件
http://stackoverflow.com/questions/28065267/mipmap-vs-drawable-folders
drawable中图片和不同设备上的换算
如果放在mdpi文件下的图大小为160像素,那么在hdpi设备上就是240,在xhdpi设备上就是320像素。
字号和高度的换算
如果是以dp为单位,那么12dp在设备上的高度就是12dp。
如果是以sp为单位,那么12sp在设备上的高度就是(12*scaledDensity)dp。
如果是以px为单位,那么当然不会以px为单位。
网友评论