Android 通用图像加载器和多屏幕注意事项

Android Universal Image Loader and Multiple Screen Considerations

我即将推出我的第一个 Android 应用程序(是的...),但我现在无法重新思考一个主要的 Android 令人头疼的问题:针对多种屏幕尺寸进行设计。

我已经阅读了很多关于这个主题的文章,我有多个可绘制文件夹,但是我有一些疑问。

这是我的 ListView 行布局(imageViews 具有固定大小)...我一直在研究图像大小,但我无法理解一件事:为什么要使用多个可绘制文件夹,而不是使用一个非常好的图像分辨率(即一个很好的显示 xxhdpi 图像)并让 Android 自行缩小?

另外,在 Photoshop 中创建图标时,如何决定使用哪个大小的图标?我正在考虑使用我在某处看到的一种技术:在 Photoshop 中使用 HDPI 通用分辨率创建一个 canvas,放置图标并获得近似尺寸(并针对每个密度调整大小),但目前我有一个大图像(256x256) 我使用 Universal Image Loader 下载并且一切正常(我只是更改了平板电脑布局中的 ImageView 尺寸) - 这种方法有什么缺点吗?我唯一能想到的就是增加下载时间。

最后,由于我正在使用 Universal Image Loader 下载我的图片,我是否应该托管 4 张图片(对应于每个屏幕密度)?再一次,我只托管了一张 256x256 的图像,它运行完美。我是否又一次牺牲加载时间来提高质量并减少实施工作?

如果我对这个问题有任何想法,我将不胜感激,因为我有点迷茫。

编辑:我最近在 MDPI 平板电脑上测试了我的应用程序,团队图标质量很差(它们在 mdpi 中为 36x36 - 假定 mdpi 启动器图标为 48x48,根据 Google 指南,并且我的图像占据较小的 space,应该足以获得一个漂亮的显示图像,但是没有......)如果我使用 xxhdpi 或 xhdpi 图像图像是好多了。那么我如何知道我的位图的正确分辨率呢?

EDIT2:同样的问题适用于我的背景图片:在我的 LG Tab 7 (MDPI) 中,图像的分辨率应该在 800x1280 左右,但是对于 mdpi phone 它可能是 320x480...所以同一个可绘制文件夹可能是两个完全不同的分辨率,这是怎么回事?我是否必须为每个背景放置 drawable-"size"-"density" 的组合?

(这是对您原始问题的部分回答。我不太了解 Edit1 和 Edit2,因此无法对它们发表评论)

这里有两点需要考虑:

  1. 您下载的图片太多了吗?额外的带宽会有所不同吗?
  2. 您是否担心应用的内存使用和性能?

一般来说,在 Android 中,大多数人担心资源大小的原因是它们的内存使用量,而不是图像拍摄的 size/space 或下载时间。

鉴于分配给您的进程的 RAM 量非常小(除非使用大堆),根据指南,强烈建议您加载的内存不要超过您的实际需要。这意味着,对于分辨率较低的设备,不要加载高质量图像,因为它们无论如何都无法利用它们。显然,您总是可以即时缩小图像,但这种解决方案并不便宜(就处理能力而言),所以如果您可以避免它,如果您的应用程序的性能很重要(虽然它不是那么大所以我除非你对 hundreds/thousands 的图像执行此操作,否则不会担心它)。通常如何为 静态资产 (例如图标)执行此操作是将您的资产放入其适当的资产文件夹 (drawable-dens)。

然而你的情况不同。您正在即时下载图像并为这种情况提供 4 种不同的资产大小可能会非常麻烦并且管理它可能会非常痛苦,因此,只要您对我所提供的内容满意已经写好了(就性能和内存使用而言,你在这里没有瓶颈),你应该对你的方法没问题,即下载单个 "high-res" 图像,然后按比例缩小根据您的需要。但是,如果您发现此解决方案不适合您,您可以采取更多 "extreme" 方法,为网络服务器上的图像提供不同的 DPI,并根据它们所在设备的硬件规格下载它们 运行上。

让我们开始说你的位图没有标准的程序和大小,我不明白你是从服务器获取它们还是将它们存储到你的 res 文件夹中,但在第二种情况下有优势不同屏幕密度的多个图像是为了避免系统每次都缩放它们,但另一方面你的 apk 大小会更大,还要注意我说的是 屏幕密度 而不是 size 因为 res 文件夹包含不同屏幕的不同图像 densities。 相反,如果你从网络上下载每张图片,我建议你使用一些缓存系统,在这种情况下,我认为没有指定的大小可以使用,这显然取决于你的应用程序和你想要显示的图像类型。 我会说你的图像应该有足够大的分辨率,可以在不同的屏幕尺寸和密度下很好地显示,并且足够小,不会让你的服务器超载。 下载已调整大小的图像也可能是一个很好的做法,而不是下载它们并缩放到应用程序中。 在上次编辑中,您问 "how is that? Do I have to place a combination of drawable-"size"-"density" for each background?",密度表示一英寸屏幕中包含的点(或像素)数。 现在将 res 文件夹视为存储桶,例如 xhdpi 可以包含不同的屏幕,这些屏幕被认为具有 xhdpi 密度(320 dpi),但它们没有相同的分辨率,因为 xhdpi 只是一个包含密度接近 320dpi 的屏幕的范围。 屏幕尺寸反而是屏幕的实际尺寸。 显然,最好的办法是开始开发您的应用程序时对 android 的工作原理有一个清晰的概念,但我认为最后您还应该在不同的屏幕尺寸和密度上尝试您的应用程序。

此处的答案涵盖了一些常见的图像问题,但我认为他们仍然缺少一些正确答案的部分。首先,有人提到了 "pixels" 和密度的区别。在您的第二次编辑中,您谈论的是屏幕上的像素数,而不是密度。您可能需要在大屏幕上使用 更大 图像,但这与 更高分辨率 图像不同。如果你想让背景显示相同的内容,那么它可能会是更高的分辨率,但是 "scaled up" 的小图像会增加像素而不增加分辨率。这是关键的区别。

在您的第一次编辑中,不清楚您的问题到底是什么。不同密度下的相同图像缩放到相同数量的 "pixels" 以不同的清晰度显示可能是几件事的结果。首先,OS 可能具有 MDPI 的操作屏幕密度,但物理上具有更多像素,允许更高分辨率的图像更清晰地显示。此外,您用于创建较低分辨率图像的采样算法可能不合适(或者可能不是设备的最佳选择)。并且该设备可能具有比您可以使用的更优化的采样策略,因为制造商对其进行了调整。所有这些因素都会导致您所描述的情况 - 并在某些情况下支持使用更高分辨率的图像。

也就是说,这里是确定方法的核心概念:

  1. 我同意下载图像时下载时间可能是一个问题。我还要补充一点,对于移动数据计划,您应该关注计划中的 usage。许多开发人员忘记了并不是每个人都连接到 WiFi 或者有无限的预算或无限的数据计划。

  2. 对于动态下载,您应该让应用程序检测屏幕 density/size,然后转到获取适当图像的终点(网络文件夹)。您应该创建每种尺寸的图像,但请记住,每台设备只需要 1 张图像即可完成其工作。所以只需下载合适的图片,就像 Android 只会使用合适的 res 文件夹中的 1 张图片。

  3. 性能实际上可能是一个问题,具体取决于您的应用功能。 res 无需缩放的适当 size/resolution 图像和适当大小的图像可提高您的应用性能。这绝对不是只关注几张图片的问题。但是,如果您在 ListView 或其他地方使用的图像会重复显示,则不应每次都使用高分辨率图像并将其缩小。

  4. 如果您的用户使用较低密度的设备(MDPI 或 LDPI),这些设备通常也具有较少的整体内存和低得多的性能。您的 "awesome" 测试设备可能没问题,但他们的体验可能很糟糕。如果您决定不遵循准则,请务必测试 "real world use"。

  5. 最后但同样重要的是,如果您有一个大型图像库,创建这些库的多个副本可能不划算。不经常使用更高分辨率的图像并不会真正影响性能、可用​​性或以其他方式恶化用户体验。换句话说,大多数时候,你不必担心这个。但是,要做好你的工作,你应该知道什么时候该担心!