1、我刚开始不理解的东西:
(1)手机平板说的屏幕大小3.7英寸是指屏幕对角线的长度,分辨率是这块屏幕显示的像素点个数。(我的手机ME525 屏幕大小:3.7寸 分辨率:854*480)
(2)屏幕密度指的是单位长度(英寸)显示像素点的个数(px),即px/英寸。
屏幕密度=对角线的像素点数量/对角线的英寸长度
(3)我们看下dp,px在android源码包TypedValue.java中的换算,我们看如下函数:
public static float applyDimension(int unit, float value,DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX://像素
return value;
case COMPLEX_UNIT_DIP://dip 要乘以像素密度
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
该函数功能:是把各单位换算为像素。
【注】:
metrics.density:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;
DENSITY_DEFAULT:是常量,值是160
2、做一下几道题目
(1)计算我的手机的屏幕密度,如下:
知道像素密度怎么计算之后,看下下一题
(2)假设现在有一块屏幕一英寸显示320个像素,另外一块屏幕一英寸显示220个像素,我的一个安卓应用上用10dp表示按钮的高,那么,
第一块显示的:像素密度(320),10dp*(320/160)= 20px
第二块显示的:像素密度(240),10dp*(240/160)= 15px 就是说在屏幕质量高的显示的像素点多。
之后看下英寸的长度,
第一块20px/320px=1/16英寸
第二块15px/240英寸=1/16英寸
也就是说dp就是屏幕长度的单位。这只是感光的觉得,下面做详细证明:
(3)证明:
英寸=dp*(px/英寸/160)/(px/英寸)=dp/160
也就是说1dp=1/160 英寸,1dp等于在屏幕上面显示1/160 英寸(我们人间的空间单位,也就是屏幕的单位)
总结,使用dp,不会因为屏幕的大小分辨率的原因改变它的长度,一厘米就是一厘米。
2、度量单位含义
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
dp: dip是一样的
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。

>个人简介:高级开发工程师,兴趣和领域(Unity、Unreal、cocos creator、安卓终端开发、ios终端开发、音视频开发、图形学),欢迎加W:wlxklyh 探讨问题。(欢迎star:https://github.com/wlxklyh/SoftRenderer)