How does quantized density affect image resource selection and scaling?

后端 未结 1 526
闹比i
闹比i 2020-12-17 03:13

Each Android device has a physical pixel density and a \'quantized density\'. Sources state that the quantized density is the one used to determine how drawable-dpi images a

相关标签:
1条回答
  • 2020-12-17 04:02

    For the scaling part of the question, first get the quantized density for the device by running

    adb shell getprop ro.sf.lcd_density
    

    and call this the quantized density for the device. In general this quantized density differs from the physical density of the device but it can be the same if the physical density falls perfectly as one of the dpi 'bucket' boundaries. Whereas the physical density describes a real-world measurement, the quantized density is set by the device manufacturer, and is usually chosen to be one of the following values:

    • 160
    • 240
    • 320
    • 480

    Quantized density controls what I will call the Image Scaling Factor (ISF) for the device. The formula is as follows:

    ISF = ro.sf.lcd_density / 160
    

    The ISF is the scale factor that is used when Android's resource-loading/layout-manager reads a resource bitmap from a file and renders it to the screen (I don't know if the scaling happens at load-time or render-time). On the Nexus 6 device, the ISF is 3.5 because the quantized density was set to be 560 (and 560 / 160 = 3.5). To be sure, the rendered size at runtime is also a function of the drawable bucket that contains the file in question. For example, on the Nexus 6:

    • 64-pixel image in mdpi folder renders as 224 pixels (since 3.5*64/1.0 = 224)
    • 64-pixel image in hdpi folder renders as 149 pixels (since 3.5*64/1.5 = 149)
    • 64-pixel image in xhdpi folder renders as 112 pixels (since 3.5*64/2.0 = 112)
    • 64-pixel image in xxhdpi folder renders as 75 pixels (since 3.5*64/3.0 = 75)
    • 64-pixel image in xxxhdpi folder renders as 56 pixels (since 3.5*64/4.0 = 56)

    Incidentally, the quantized density also defines the physical size of the dp that you specify in your layout files. The formula for this is:

    +=======================+
    |          Dq           |
    |   1dp = ----- px      |
    |          160          |
    +=======================+
    

    where Dq is the quantized density. For example,

    • on a device whose Dq is 160, 1dp = 1px
    • on a device whose Dq is 240, 1dp = 1.5px
    • on a device whose Dq is 320, 1dp = 2px
    0 讨论(0)
提交回复
热议问题