Android 屏幕术语与单位换算

12 阅读3分钟

概念

  1. pixel density: wikipedia.org/wiki/Pixel_…
    PPI: wikipedia.org/wiki/Pixels…
    DPI: wikipedia.org/wiki/Dots_p…
  2. px: en.m.wikipedia.org/wiki/Pixel
  3. dip/dp: wikipedia.org/wiki/Device…
  4. Typography: wikipedia.org/wiki/Typogr…
  5. pt: wikipedia.org/wiki/Point_…
  6. Windows Presentation Foundation: wikipedia.org/wiki/Window…
  7. m3.material.io/blog/device…

术语

物理:

  1. 通常 不能 轻易改变.
    有时称为 硬件.
    反之称为 软件 (由 系统用户 共同决定, adb 中也称 Override).
  2. 通常 只影响 用户的 直观视觉感受.
  3. 通常 不会 直接影响到 开发者 进行 UI 的适配.
缩写全称中文是否可变
in 或者 inch英寸不可变
pt (typography)point (typography)点 / 磅 (印刷排版)不可变, 等于 1/72 inch
缩写全称中文是否可变
"physical" px"physical" pixel"物理" 像素不可变
logical pxlogical pixel逻辑像素可变, 包括 pt (iOS), dp/dip, sp 等
pt (iOS)point (iOS)点 (iOS)可变
dp / dipdevice-independent pixel设备无关像素可变
spscale-independent pixel比例无关像素可变
缩写全称中文是否可变
-density密度可变
-pixel density像素密度可变
缩写全称中文是否可变
DPSdevice physical size设备物理尺寸可变, 单位: 英寸
缩写全称中文是否可变
rresolution分辨率可变, 单位 px
rwresolution width分辨率 宽可变, 单位 px
rhresolution height分辨率 高可变, 单位 px
prphysical resolution物理分辨率可变, 单位 px
lrlogical resolution逻辑分辨率可变, 单位 px
physical PPIphysical pixels per inch物理 每英寸像素数可变
logical PPIlogical pixels per inch逻辑 每英寸像素数可变, 跟 DPI 异曲同工, 殊途同归
DPIdots per inch每英寸点数可变, 由 ROM / 用户 决定
swsmallest width最小宽度可变, 单位 dp
缩写全称中文是否可变
TSStext size scale文本字号比例可变, 由 ROM / 用户 决定

DPI

各平台 默认 1:1 DPI

平台
Android160
iOS163
Windows96
Ubuntu96
Mac OS X / macOS72

Android DPI

缩写密度
ldpi~120
mdpi~160~1
tvdpi~213~1⅓
hdpi~240~1½
xhdpi~320~2
xxhdpi~480~3
xxxhdpi~640~4

运算

diagonal = √‾(rw² + rh²) px
PPI = diagonal / DPS
density = DPI / mdpi
1 dp = 1 px × density
1 sp = 1 dp × TSS
sw = rw / density = rw × mdpi / DPI
rw = density × sw = DPI × sw / mdpi
DPI = density × mdpi = rw × mdpi / sw
density = DPI / mdpi = rw / sw

例如

  1. physical DPI = 320
    → physical density = 2
  2. logical DPI = 300
    → logical density = 1.875
  3. pr 720 (px) x 1280 (px)
    → physical sw = 720 / 2 = 360 (dp)
  4. lr 740 (px) x 1300 (px)
    → logical sw = 740 / 1.875 = 394⅔ (dp)

小例子

ModelDPSPPIDPIdensityr pxr dp
Pixel XL5.5″534.04560dpi3.51440 x 2560411.43 x 731.43
Pixel5″440.58420dpi31080 x 1920360 x 640
Nexus 6P5.7″515.30560dpi3.51440 x 2560411.43 x 731.43
Nexus 5X5.2″423.64420dpi2.6251080 x 1920411.43 x 731.43
Nexus 65.96″492.82560dpi3.51440 x 2560411.43 x 731.43
Nexus 54.95″445.03xxhdpi31080 x 1920360 x 640
Nexus 44.7″317.60xhdpi2768 x 1280384 x 640
Galaxy Nexus4.65″315.83xhdpi2720 x 1280360 x 640
Nexus S4″223.24hdpi2480 x 800240 x 400
Nexus One3.7″252.15hdpi2480 x 800240 x 400
ModelDPSPPIDPIdensityr pxr dp
Nexus C9.94″314.84xhdpi22560 x 18001280 x 900
Nexus 98.86″288.94xhdpi21536 x 2048768 x 1024
Nexus 77.02″323.45xhdpi21200 x 1920600 x 960
Nexus 7(2012)7″215.02tvhdpi1.333800 x 1280600 x 640
Nexus 1010.05″300.39xhdpi22560 x 16001280 x 800

常用命令

获取 显示的一些参数

adb shell dumpsys display

修改 lr

# 查询
adb shell wm size

# 设置
adb shell wm size 1080x1920

# 恢复
adb shell wm size reset

修改 DPI

# 查询
adb shell wm density

# 设置
adb shell wm density 420

# 恢复
adb shell wm density reset

或者 修改 build.prop 然后 至少重启 SystemUI:

ro.sf.lcd_density=420

Android 7/8 启用 Freeform

# 启用
adb shell settings put global enable_freeform_support 1
adb reboot

# 禁用
adb shell settings put global enable_freeform_support 0
adb reboot