量化密度如何影响图像资源选择和缩放?

Jos*_*son 5 android

每个Android设备都具有物理像素密度和"量化密度".来源声明量化密度是用于确定如何在运行时选择和缩放drawable-dpi图像的密度.

问题:如何选择这些图像(1)和(2)缩放?

例如,放置在drawable-xhdpi存储桶中的64x64图像会缩放到什么尺寸?

Jos*_*son 10

对于问题的缩放部分,首先通过运行获得设备的量化密度

adb shell getprop ro.sf.lcd_density
Run Code Online (Sandbox Code Playgroud)

并将其称为设备的量化密度.通常,这种量子化密度不同于器件的物理密度,但如果物理密度完全落入dpi"桶"边界之一,则它可以是相同的.物理密度描述实际测量,而量化密度由设备制造商设置,通常选择为以下值之一:

  • 160
  • 240
  • 320
  • 480

量化密度控制我称之为设备的图像缩放因子(ISF).公式如下:

ISF = ro.sf.lcd_density / 160
Run Code Online (Sandbox Code Playgroud)

ISF是当Android的资源加载/布局管理器从文件读取资源位图并将其呈现到屏幕时使用的比例因子(我不知道在加载时或渲染时是否发生缩放) .在Nexus 6设备上,ISF为3.5,因为量化密度设置为560(和560/160 = 3.5).可以肯定的是,运行时渲染的大小也是包含相关文件的可绘制存储桶的函数.例如,在Nexus 6上:

  • mdpi文件夹中的64像素图像呈现为224像素(自3.5*64/1.0 = 224)
  • hdpi文件夹中的64像素图像呈现为149像素(自3.5*64/1.5 = 149)
  • xhdpi文件夹中的64像素图像呈现为112像素(自3.5*64/2.0 = 112)
  • xxhdpi文件夹中的64像素图像呈现为75像素(自3.5*64/3.0 = 75)
  • xxxhdpi文件夹中的64像素图像呈现为56像素(自3.5*64/4.0 = 56)

顺便提一下,量化密度还定义了您在布局文件中指定的dp的物理大小.这个公式是:

+=======================+
|          Dq           |
|   1dp = ----- px      |
|          160          |
+=======================+
Run Code Online (Sandbox Code Playgroud)

其中Dq是量化密度.例如,

  • 在Dq为160,1dp = 1px的设备上
  • 在Dq为240,1dp = 1.5px的设备上
  • 在Dq为320,1dp = 2px的设备上