【问题标题】:Are density-specific graphics always necessary?是否总是需要特定密度的图形?
【发布时间】:2014-06-17 23:58:36
【问题描述】:

我是 android 开发新手,我一直在阅读有关如何在我的应用程序中正确包含图像资源的信息。各种文章(包括android developer guide)描述了通过将多个图像放置在基于约定的资源文件夹中来定位不同的屏幕尺寸。

虽然系统会根据 当前屏幕配置,您可能需要进行调整 不同屏幕尺寸上的 UI 并提供位图可绘制对象 针对不同的密度进行了优化。

但是,这意味着不一定总是需要包含针对不同屏幕尺寸的多个图像。

如果我为大屏幕添加了足够大小的单个图像,那么系统应该将其缩小以适应较小的屏幕,而不会出现任何像素化或损失,对吧?我原以为这种方法还可以减少应用程序的整体负载,因为捆绑到应用程序中的图形文件更少。

我明白,在某些情况下,应用设计师可能希望根据屏幕尺寸定制单独的图形,但对于一般情况,单文件方法是更合适的策略吗? 提供特定密度的图形有什么缺点?

【问题讨论】:

  • 您永远不能保证不会出现像素化或丢失。此外,如果您有大量图像,则使用这种方法可能会在低端设备上遇到内存问题。它是处理事物的一种方式,但它并不是适用于所有应用的完美方式。
  • 我通常使用高 dpi 图像进行开发,直到我确定应用程序的“外观”没问题,然后通过自动 batch converter 运行图像以获得较低的密度,然后手动修复任何在较低分辨率设备上看起来不好的东西。这似乎是最懒惰的方法,在对旧/低内存设备友好的同时仍能产生良好的结果。除了 9 补丁之外,这可能是完全不同的球赛,因为您可能希望每个设备有不同的绘制/拉伸。
  • @GabeSechan 承认我没有考虑 RAM 限制,也许我过于关注应用程序大小
  • @RedTaz 是的;您必须记住,要将图像缩小到手机中,可能必须在重新采样之前将整个图像解压缩到完整大小的内存中 - 这可能比“磁盘上 PNG 的压缩大小”大得多“...

标签: android image screen-size


【解决方案1】:

通常你应该至少提供drawables:

  • mdpi
  • hdpi
  • xhdpi
  • xxhdpi

ldpi 现在几乎无关紧要,因为几乎没有任何设备仍然属于该类别。通常你也不需要xxhdpi以上的任何东西。可以只提供xxhdpi 可绘制对象,Android 会根据其他密度缩放它们,但这并不完美。可能有一些像素化或通常较低的图像质量。如果您想要好的结果,您需要提供所有相关密度的可绘制对象。

如果您以某种方式无法提供较低密度的图像(我必须再次强调,应尽可能避免这种情况)您可以帮助 Android 正确缩放图像,方法是仅使用易于分割的尺寸和布局乘以 8、4 和 2。例如,您可以使用 8dp12dp,而不是使用 10dp。使用只能被这三个因素整除的大小实际上是最佳做法。

有一些工具可以帮助您正确缩放可绘制对象。即SDK自带的图片缩放工具和Android Asset Studio

我确定您已经阅读过,但这里是link to the relevant documentation

编辑:既然您提到可以通过不包括较低密度的图像来保持 APK 更小:您必须记住最高密度的可绘制对象占您的大部分大小APK。不包括低密度的那些对 APK 大小的影响并不大。

【讨论】:

    【解决方案2】:

    在布局中,您有一个 imageView,您希望在其上显示一些图像。这张图片的尺寸是 1100X800(以适应最大尺寸)。

    基本上,您的方法应该可行,但问题是您需要构建布局,以便明确定义容器的尺寸。我的意思是要么您必须为图像视图提供静态尺寸 (W:H),要么使用线性布局和权重。

    此外,使用这些最大尺寸的图像可能适用于图像视图容器,因为它们是专门为处理图像而构建的,因此具有一组您可以使用的属性。如果您为 relativeLayouts/LinearLayouts/Buttons 使用相同的图像作为背景,则可能会更加忙碌。

    此外,如果您的图像只是要使用的纹理或颜色,那么这种方法很好。但是,如果您的图像中有文本或徽标或某些特定形状,这种方法往往会以不成比例的大小显示图像。这部分永远不会被接受。

    【讨论】:

    • 我实际上正在使用具有可伸缩ImageViews 的布局和权重,可以拉伸以适应屏幕,我认为这就是我提出这个问题的方式,这个答案很有帮助,谢谢
    【解决方案3】:

    理论上可以,但实际情况有点不同。

    正如 Gabe 在评论中提到的那样,具有 800x480 4" 屏幕的设备的内存很可能比 quadHD 5" 屏幕设备至少少 4 倍。

    因此,如果您仅包含上述 xxhdpi,整体性能(尤其是在列表滚动时)将受到严重影响,而且低端(或更旧)设备在处理您的应用时可能会出现 OutOfMemory 异常。

    如果您担心应用程序的大小,最好的方法是使用 gradle 构建系统提供的风格(请参阅 Android-Studio)。

    【讨论】:

      【解决方案4】:

      这也取决于图像的使用情况。如果它只是一个按钮图像资源,您可能想要使用一个可扩展的图像资源,例如这些 9-patch 的。如果是这种情况,请参阅此 .9.png 指南:http://developer.android.com/tools/help/draw9patch.html

      【讨论】:

      • 我不明白这与问题有什么关系。即使您使用 9-patch,您仍然需要为所有相关密度提供它。
      • 好吧,9 补丁很有用。但它们例如用于按钮,仅上下缩放背景会使背景变形。您仍然需要提供所有相关密度的 9 补丁。
      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多