Android UI 设计:pixel dip dpi sp density
1. px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位。
dip或dp (device independent pixels)设备独立像素,与设备屏幕有关。
sp (scaled pixels — best for text size):类似dp,主要处理字体的大小。
dpi(dot per inch):屏幕像素密度,每英寸多少像素
density:density表示每英寸有多少个显示点(逻辑值),它的单位是dpi
在 android api 有跟这个同名的成员,获取方法:
float value = context.getResources().getDisplayMetrics().density;
2. dpi是屏幕像素密度。就是1英寸上像素点的个数。
对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚。
3. sp由于是放大像素,主要是用于字体显示。
由此根据google的建议,TextView的字体大小最好用sp做单位
4. dp是与密度无关,sp除了与密度无关外,还与scale无关。
如果屏幕密度为160,这时dp和sp和px是一样的。即此时1dp=1sp=1px
但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。
那么原来TextView的宽度设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。
但如果设置成160dp或160sp的话,系统会自动将width属性值设置成320px的。
也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。
也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。
5. pixel和dip计算公式:pixel值 =(dpi值/160)* dip值
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
6. 像素密度和分辨率是两个不同的概念
分辨率是总的像素点,像素密度是单位长度的像素点
HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120
VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480
HVGA:Half-size VGA;即:VGA的一半,分辨率为480×320;
QVGA:Quarter VGA;即:VGA的四分之一,分辨率为320×240;
WVGA:Wide Video Graphics Array;即:扩大的VGA,分辨率为800×480像素;
WQVGA:Wide Quarter VGA;
即:扩大的QVGA,分辨率比QVGA高,比VGA低,一般是:400×240,480×272