屏幕适配专题笔记

背景

安卓面试基础面,偶尔会被问到屏幕适配的技巧,
结合自己所搜集的数据,进行一次梳理记录。

为什么要做屏幕适配

原因:适配得做好,下班回得早。
安卓系统的开源属性,各厂商都有不同的定制系统产品,屏幕尺寸相当多。
用专业术语来说,即安卓屏幕碎片化。

屏幕适配常用概念

尺寸、像素密度、分辨率概念

屏幕的物理属性。

Android Studio 新建模拟器,用pixel2举例。

Android phonewindow view window 屏幕 屏幕安卓_屏幕适配

  • 尺寸:对角线尺寸,单位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
  • Android phonewindow view window 屏幕 屏幕安卓_屏幕密度_02

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做起来相对直观一些。实在怕麻烦,可以用脚本批量替换。