屏幕适配专题笔记
背景
安卓面试基础面,偶尔会被问到屏幕适配的技巧,
结合自己所搜集的数据,进行一次梳理记录。
为什么要做屏幕适配
原因:适配得做好,下班回得早。
安卓系统的开源属性,各厂商都有不同的定制系统产品,屏幕尺寸相当多。
用专业术语来说,即安卓屏幕碎片化。
屏幕适配常用概念
尺寸、像素密度、分辨率概念
屏幕的物理属性。
Android Studio 新建模拟器,用pixel2举例。
- 尺寸:对角线尺寸,单位
inch
,上图显示为5.0"
,1英寸 = 2.54cm
- 分辨率:
1080px * 1920px
- 屏幕像素密度:每英寸的像素点数(dots per inch,即
dpi
)
计算公式为:√(W^2+H^2)/S
,其中W和H是分辨率的宽高,S是屏幕尺寸。
dp dpi dip px概念
仅与软件相关
- dpi:屏幕像素密度,不参与这一part的横向比较。
- dp:即dip。全称Density Independent Pixels,简写为dp。
- px:屏幕像素,如下图(来自百度)
- dp与px基本关系:以160dip为基准,
1dp = 1px
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi关系
类型 | 分辨率 | 屏幕密度区间 | 换算dp->px | 比例 |
ldpi | 240x320 | [120,160) | 1dp=0.75px | 3 |
mdpi | 320x480 | [160,240) | 1dp=1px | 4 |
hdpi | 480x800 | [240,320) | 1dp=1.5px | 6 |
xhdpi | 720x1280 | [320,480) | 1dp=2px | 8 |
xxhdpi | 1080x1920 | [480,640) | 1dp=3px | 12 |
xxxhdpi | 1440x2560 | [640,next dpi) | 1dp=4px | 16 |
通用理解:在mdpi
中使用width=100px , height=100px
的图标,屏幕密度为320的设备中,图标显示为width=150px , height=150px
,效果会显得模糊一些。
概念搞清楚了,如何运用
- 场景1:提前跟UI沟通,让UI出图时,把其他倍图同步输出。也可以建好目录,让UI把图往里面放即可。
- 场景2:做多屏开发时,非主屏的屏幕密度,在framework中是自动计算得到。如果懂得概念,可以手动修改,或者新增配置,达到你想要的效果。如:
..frameworks/base/services/core/java/com/android/server/display/DisplayDeviceInfo.java
public void setAssumedDensityForExternalDisplay(int width, int height) {
//默认计算dpi
//densityDpi = Math.min(width, height) * DisplayMetrics.DENSITY_XHIGH / 1080;
//手动修改dpi,建议使用配置
densityDpi = 160;
//...
}
- 场景3:布局文件中,常规用dp作为控件的大小。但在某些特殊场景,如非移动端巨量的屏幕尺寸,px可能更加直观,不用考虑屏幕密度,也许会带来更高的效率。就比如我从事过白家电的一些项目,屏幕尺寸不多,一个项目做1年以上的那种,用px做起来相对直观一些。实在怕麻烦,可以用脚本批量替换。