2012-04-04 77 views
2

我有需要缩放到屏幕大小的图像。图像中也会有文字,需要翻译成第二种语言。因此,每个图像都会有两个版本开始,每种语言都有一个版本。减少Android可选择的可绘制资源

Google建议每个密度都有一个图像资源。所以我会把我的两个图像乘以4:xhdpi,hdpi,mdpi和ldpi。但随后谷歌说不同的屏幕尺寸有不同的图像资源。这使我的图像再乘以4:xlarge,large,normal和small。我不想创建每个图像的32份副本!

我想知道是否有任何错误,使xlarge屏幕和xhdpi密度的图像只。 IE - 最好的质量。让Android按照dp单位的标准缩小图像的密度以降低密度。当我在较小的屏幕上画画时,我可以使用Canvas类进一步缩小比例。每次需要重绘位图时,我都可以缓存生成的缩放比特图对象,以避免昂贵的缩放计算一遍又一遍地运行。

这样做有什么缺点吗?还是有更好的方法来避免制作同样图像的这么多副本?

回答

0

在小型(低端)设备上缩放大型图像时会出现性能损失。这是否显而易见取决于您需要显示的图像数量。
对于记忆也是同样的,必要的变通。

+0

谢谢,很好的反馈。澄清一点:我希望通过缓存缩小的位图,然后它应该垃圾收集原始较大的图像。我不认为这个一次性GC事件会影响到这个特定应用程序的差异。但是,你知道缩减后的缓存位图实例是否会具有相同的内存占用量,还是会比使用Google的备用资源方法实例化时大? (假设两种方法都会产生相同物理尺寸的位图。)如果尺寸较大,那么对我来说这可能是个问题。谢谢! – 2012-04-04 14:47:21

+0

好问题。我不确定你打算如何缩减比例,所以很难给出最终答案(只要我知道:-))。你可以做以下(间接)测试:从资源加载一个位图后,我假设isMutable()将返回false。我想在缩放之后,得到的位图将具有isMutable()= true,间接表明它是一个副本,因此可能拥有自己的内存。 – 2012-04-04 14:56:21

0

我只为最高的xhdpi像素密度创建位图,然后在其他屏幕类型上进行测试。

如果位图在某些密度较低的屏幕上看起来不好,我会重新制作该密度。而这种情况很少发生......

此外,不需要为不同的屏幕尺寸(small/xlarge)制作特殊的位图 - 只需让ImageView-s变小/变大 - 图像缩放不是一个缓慢的操作,所以在大多数情况下你不需要担心它(除非你的位图覆盖整个屏幕)。