android - 根据分辨率/密度从资源中分配最佳质量的图像

标签 android nine-patch xml-drawable

我正在努力处理 Android“多屏幕尺寸”域中的一项非常琐碎的任务。

我要实现的目标

与屏幕宽度相匹配的布局,具有可调整大小的九色背景(仅限水平方向,因为始终有足够的垂直空间)。这是一个虚拟图像:horizontally stretchable nine patch image with two regions on left and right ends

我的目标是,根据屏幕分辨率,通过使用一组不同的尺寸,以尽可能高的分辨率显示图像,例如。 320x45、480x67、600x87、720x101,没有任何缩小。 我希望有一个非程序化的解决方案。

上述图像尺寸的示例是:

  • 3.7 英寸 Nexus One (480 x 800) - 480x67 图片效果最佳。
  • 4.7"Galaxy Nexus (720 x 1280) - 720x101 图片。
  • 4.7 英寸 Nexus 4 (768 x 1280) - 同样是 720x101 图片,拉伸(stretch)到完整的 768 像素宽度,变成 768x101。

问题

整个 Android 资源分配围绕 dp(密度无关像素)进行,而实际上我想根据实际可用像素显示图像。

如果我将 480x67 图像分配给 res/drawable-mdpi,将 600x87 图像分配给 res/drawable-hdpi,那么图像将在 5.4" display of 480x800 上正确显示,即 mdpi 显示。但是,4"480x800 显示器符合 hdpi 标准,系统将指定 600x87 image, which won't fit the screen

我按照描述尝试了 smallestWidth 参数 in the online guide ,但这会产生奇怪的结果。例如,3.7"480 x 800 显示器 (hdpi) 使用我的 drawable-sw320dp 图像,尽管也有可用的 drawable-sw480dp 资源。

分配具有最佳质量的可拉伸(stretch)、宽度匹配图像的最佳方法是什么?有没有非程序化的解决方案?

提前致谢!

最佳答案

我相信,通过结合密度和屏幕尺寸资源限定符,您可以获得接近最佳的行为。

让我们假设这种资源文件夹结构:

  • drawable-normal-hdpi - normal 大小决定最小宽度 320dp。 hdpi 指示 1.5X dp 到像素倍增器。所以最小px normal hdpi 桶的宽度是 480px。我们在这里放了一个 480px 宽的 图片。
  • drawable-normal-xhdpi - 同样大小决定 320dp 但这次 与 2X 乘数。所以我们使用 640 像素宽的图像。
  • drawable-xlarge-mdpi - 大小表示至少 720dp。 mdpi 乘数 是 1X,所以我们使用 720px 宽的图像。

现在让我们看看一些设备,看看它们是如何落入这些桶中的:

  • Nexus one - 正常 hdpi。实际像素宽度:480 像素。图像适合 完美。
  • Galaxy nexus - 正常 xhdpi。我们可以适应 720px 的图像,所以 我们使用的 640 像素图像不是最优的 - 但它非常接近。
  • Nexus 4 就像 Gnex。
  • Nexus 10.1 (1280X800) - xlarge mdpi。我们可以容纳 800px,我们的图像 是720px。再次不理想,但足够接近。

最坏情况:使用的图像质量可能提高 5-10%。 最佳情况:完美契合。

这种方法的主要缺点是你需要提供大量的资源和文件夹来解释所有大小和密度的排列(如果你需要将它与更多的区域设置、方向等限定符结合起来,那就更糟了在)。但是,就我对 Android 的理解而言,我认为如果不编码,您无法实现比这更好的东西。


关于 smallestWidth 的评论:您的奇怪行为示例实际上是预期的行为。 hdpi 乘数是 1.5 - 所以 480px 宽的 hdpi 显示器正好是 320dp 宽。如文档所述,这使得 drawable-sw320dp 成为正确的选择。我不确定您是否可以将 smallestWidth 限定符与 dpi 限定符结合使用。如果可能的话,您可能会得到比尺寸修饰符更准确的结果。但这意味着图像质量提高 5% 需要更多排列。可能不值得。

关于android - 根据分辨率/密度从资源中分配最佳质量的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23533181/

相关文章:

java - 对 ArrayAdapter 的未经检查的调用

android - 如果我的应用程序没有运行,AlarmManager 会工作吗?

Eclipse 3.5.2 中 Android ninepatch 图像错误

Android Shape - 带有圆形和不同顶部颜色的正方形

android - XML 中的垂直条纹背景?

android - Android 上 ListView 中的 MediaPlayer

android - 使用 React Native 读取 NFC 标签类型 "android.nfc.tech.NfcV"和 "android.nfc.tech.NdefFormatable"

Android 按钮图像变得模糊?

Android:9 补丁图像未按预期拉伸(stretch)

android - Scale Drawable - setImageLevel 决定比例吗?