1. 概念理解
像素(px/pixel):屏幕上的点,是数码设备最小的独立显示单位,例如分辨率1920*1080就是像素点个数。Android开发中不建议直接使用px,而是建议使用dp代替px来完成视图尺寸的定义。
分辨率(Resolution):指屏幕纵向和横向像素个数,例如1920*1080,表示纵向有1920个像素点*横向1080个像素点。
英寸(in/inch):用于表达手机对角线的物理尺寸,1in(英寸) =2.54cm(厘米)。
dpi(Dots Per Inch):每英寸像素点数量,可以反映屏幕的清晰度, dpi=纵向像素平方+横向像素平方之和开根(初中勾股定理,求直角三角形斜边)再除以英寸值,例如1920*1080分辨率5英寸的手机上,即√(1920^2 + 1080^2) / 5 约等于441。
密度(density):指的是屏幕里像素值浓度,density = dpi/160。160dpi是Android假定的基准密度,换句话说,就是160dpi就是密度为1。
dip(device independent pixels/与密度无关的像素/dp):在屏幕密度为1也就是dpi=160的屏幕,1dp = 1px。Android开发中在布局中指定视图尺寸时,推荐将dp作为度量单位,dp = px / 密度。
sp(scale-independent pixel/与比例无关的像素):与dp类似,用于指定字体大小,和dp不同的是它可以自动根据用户的字体大小偏好来缩放。
pt(磅):1磅等于1/72英寸。
2. Adnroid对手机屏幕尺寸和dpi分级情况
密度等级 | dpi范围 | 密度值/dp和px比例 | 通常的分辨率(通常但不一定,还要结合英寸) |
低密度(ldpi) | 0~120dpi | 0.75 / 1dp=0.75px | 320*240 |
中密度(mdpi) | 120~160dpi | 1 | 480*320 |
高密度(hdpi) | 160~240dpi | 1.5 | 800*480 |
超高密度(xhdpi) | 240~320dpi | 2 | 1280*720 |
extra high(xxhdpi) | 320~480dpi | 3 | 1920*1080 |
extra extra high (xxxhdpi) | 480~640dpi | 4 | 2560 * 1440(2K分辨率) |
extra extra extra high(xxxxhdpi) | 640~960dpi | 6 | 3840 * 2160(4K分辨率)(4K电影其影片分辨率4096×2160,而电视、手机领域,由于过去屏幕16:9为主流比例,因此4K指的是3840×2160的物理分辨率) |
3. dp转换px
实际px = dp * (dpi / 160 ),其中dpi可以是120、160、240、320,等。因此,当一个100dp的Button显示在一个315dpi的屏幕上时,其实际宽度是100 * ( 320 / 160 ) = 200px。为了证明,你可以在XML布局中定义100dp的Button,而在代码中获取Button对象使用对象的getWidth()方法获得其以像素数为单位的宽度看看是否为200px。
在实际开发中,若需要进行dp和px的转义,可以使用以下代码:
public static int dp2px(Context context, float dp) {
// +0.5f是为了四舍五入
return (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics()) + 0.5f);
}