如果 Android/iOS 缩放它们,为什么不同密度桶的图像大小不同?

Why different image sizes for different density buckets if Android/iOS scales them?

我正在开发 Android+iOS 应用程序,我们需要一些图像。我希望图像具有 "touchable" 大小,例如在所有设备上为 15 毫米。对于屏幕更大的设备,我想容纳更多图像,而不是让图像变大。

我的问题是如何select图像的分辨率(以像素为单位)

要在所有设备上使图像为 15 毫米,有两种策略:

  1. 提供不同分辨率的图像和select最接近的匹配
  2. 缩放它们以使其适合

采用第一种策略的专业人士认为,这是获得像素完美图像的唯一方法。但也有缺点:

在Android中有不同的"density buckets":ldpi、hdpi、mdpi、xhdpi等,不同的设备属于不同的密度桶。但是精确的密度可能还是相差很大。因此,如果我决定采用第一种策略并为 xhdpi (320dpi) 提供正确尺寸的图像,则具有 350 或 300 dpi 的设备可能仍属于该密度桶,并且生成的图像尺寸会有所不同。

因此,我认为第二种策略(缩放图像以使其适合)更好。但后来我想知道为什么我应该提供不同分辨率的图像?每个密度桶的 "optimal resolution"(给定以毫米为单位的尺寸要求)是多少?

我知道在 xxxhdpi 显示器上显示的图像可能比在低分辨率显示器上显示的图像更详细。所以我可以看到为每个密度桶提供不同的图像是有意义的。但是我不明白为什么要缩放它们,为什么它们应该有不同的分辨率?

为什么不能所有密度桶都有尺寸为 1024x1024 的图像?而且,鉴于原件是相同的,为什么我还要为不同的密度桶提供不同的图像?

So if I decide on the first strategy and supply the image in correct sizes for xhdpi (320dpi) a device with 350 or 300 dpi may still belong to that density bucket and the resulting image will vary in size.

仅当您将 ImageView(或任何使用图像的小部件)设置为基于 wrap_content 调整大小时。如果您将小部件大小设置为基于其他尺寸(例如 15mm),则 Android 将根据密度选择图像,然后缩放以固定指定的尺寸。

why should I supply the images in different resolutions?

质量。缩放图像的次数越多,表观图像质量就越低。对于放大图像尤其如此,尽管您也会遇到缩小图像的问题。

此外,特别是在 Android 1.x/2.x 设备上,这种缩放是使用应用程序内存(堆 space)完成的;避免这种缩放将有利于内存使用。 AFAIK,在现代设备上,这种缩放是在 GPU 上完成的,这在一定程度上有所帮助。但是,总的来说,您希望尽可能使用最小分辨率的位图作为输入,从而为您提供满足您的需求和用户期望的视觉结果。这就是我们为低密度设备使用低分辨率位图的原因——向下缩放肯定会浪费 RAM,而且并非所有用户都拥有配备大量 RAM 的高端设备。

And what is the "optimal resolution" (given a size requirement in mm) for each density bucket?

密度以每英寸的点数或像素表示。将您的毫米值转换为英寸,然后乘以密度以获得以像素为单位的值。

Why can't all density buckets have images of size 1024x1024 for example?

绝对欢迎您这样做,如果它能以某种方式为您提供所需的结果,并且不会为用户浪费磁盘 space 或堆 space。