屏幕适配
基本概念
-
屏幕尺寸(Size),指屏幕的对角线的长度,单位是英寸(Inch),1英寸=2.54厘米。
-
屏幕分辨率(Resolution),指屏幕在横纵向上的像素点数,单位是px(Pixel),1px=1个像素点。一般以纵向像素*横向像素,如1920 * 1080。
-
屏幕像素密度,指每英寸上的像素点数,单位是dpi(Dots Per Inch)。
-
独立像素密度(Density independent Pixels),单位是dp、dip,基准比例 density = dpi / 160。
-
px = dp * ( dpi / 160 ) = dp * density ,当设备为160dpi时,1px=1dp。
资源匹配规则
- values-mcc310(sim卡运营商)-en(语言)-sw320dp(屏幕最小宽度)-w820dp(屏幕最佳宽度)-h820dp(屏幕最佳高 度)-large(屏幕尺寸)-long(屏幕长短边模式)-port(当前屏幕横竖屏显示模式)-car(dock模式)-night(白天或夜 晚)-ldpi(屏幕最佳dpi)-notouch(触摸屏模类型)-keysexposed(键盘类型)-nokey(硬按键类 型)-navexposed(方向键是否可用)-nonav(方向键类型)-v26(android版本)
- 属性是屏幕大小,向下最佳匹配。通用布局使用最低分辨率
- 屏幕像素密度dpi,最接近屏幕像素密度匹配,遵循“先高再低”原则,然后按比例缩放
- mdpi = ~ 160 = 1x;hdpi = ~ 240 = 1.5x;xhdpi = ~ 320 = 2x;xxhdpi = ~ 480 = 3x;xxxhdpi = ~ 640 = 4x;48 - 72 - 96 - 144 - 192 px
例子
计算5.5寸1920 * 1080的手机参数:
- 屏幕尺寸:size = 5.5 inch
- 屏幕分辨率:resolution = 1920 * 1080
- 斜边的长度:length = 2203;1920^2 + 1080^2 = 2203^2
- 屏幕像素密度:2203 / 5.5 = 400 dpi;xxhdpi
- 独立像素密度:1dp = 400 / 160 = 2.5 px
- values-swXXXdp:XXX = 1080 * 160 / 400 = 432;向下匹配
其他
手机中的 /system/build.prop 文件中有一行定义了系统使用的dpi(有些厂商会自行修改):
ro.sf.lcd_density=480
转换
fun px2dp(px: Float) = px / Resources.getSystem().displayMetrics.density
fun dp2px(dp: Float) = dp * Resources.getSystem().displayMetrics.density
fun Float.dp2px() = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
this,
Resources.getSystem().displayMetrics
)