多重绘图的优点是什么?

时间:2017-08-07 17:17:18

标签: android

大多数资源都指出,当我们使用(ldpi,mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi)时,android不需要重新缩放图像,我们也不会有cpu开销来重新缩放图像。

但我还没有得到那一点,假设我有一个已经提到的所有尺寸的图标图像(36px,48px,72px,96px,144px和192px),嗯,在下面的代码中你看到我用40dp那个它不匹配任何上面的尺寸,所以android会再次重新缩放图像,那么如果多个drawable有什么优势呢?

<ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android: src="@drawable/icon"
        />

2 个答案:

答案 0 :(得分:0)

对于您在布局中描述的DP,您通常不会拥有精确像素匹配的图像 - 就像您在上面描述的情况一样。发生这种情况时,Android仍需要进行一些扩展。

好处不是节省CPU,节省内存。 对大图像进行缩放操作可能需要大量内存,尤其是在从小到大或从大到小缩放的情况下。

如果您开始使用的图像很接近且只需要缩放一点,那么内存成本就不那么重要了。

如果图像是w500px,h500px,即250000像素。即使该图像是jpg并在磁盘上压缩为10kb,缩放也需要Android转换为RGB或ARGB,即每像素3或4个字节。

4字节x 250000 = 1M内存。 XXXHDPI设备上的500px在屏幕上仅约1英寸。 所以你可以看到它如何迅速加起来。

编辑:这可能有用https://developer.android.com/topic/performance/graphics/load-bitmap.html

答案 1 :(得分:-1)

与Aaron所说的相反,提供这些图像的好处与系统资源无关,而是关于您的应用在不同设备上的用户看法。通过提供相同图像的高分辨率副本,高分辨率设备上的用户将看到清晰,清晰的图像,而不是放大的模糊图像。

您的问题提到图像的特定像素尺寸。我假设这些值取自https://developer.android.com/guide/practices/screens_support.html

  
      
  • 36x36(0.75x)用于低密度
  •   
  • 中等密度
  • 的48x48(1.0x基线)   
  • 72x72(1.5x)高密度
  •   
  • 96x96(2.0x),用于超高密度
  •   
  • 144x144(3.0x),用于额外超高密度
  •   
  • 192x192(4.0x),用于额外超高密度
  •   

当您为图片提供所有这些不同的分辨率时,提供不同的物理尺寸。当然144x144比48x48大三倍,但是当用户在他们的设备上看到这个144x144图像时,它不会出现三倍大。

当用户使用具有高分辨率屏幕的设备时,系统将仅选择显示144x144图像。这意味着其显示屏中的各个像素将更小,这意味着144x144图像将占用与低分辨率屏幕上48x48相同的物理空间。

简而言之:此示例中的所有图像均为48dp x 48dp。

现在,如果您在40dp x 40dp的ImageView中显示此图像,则图像将被裁剪或缩小。但这与您提供的额外图像无关。无论是在低分辨率屏幕还是高分辨率屏幕上,系统仍然会将48x48图像填充到40x40容器中。

更新

这是一个例子。我已经使用Android Studio的New -> Image Asset菜单来创建图片。您可以看到AS生成具有不同尺寸的同一图像的多个副本:

enter image description here

接下来,我创建了两个模拟器:

然后我运行一个只显示我的图像的应用程序:

你可以看到状态栏,操作栏和小安卓都显示相同的大小。但Nexus S正在显示hdpi图像(48px x 48px),而Nexus 5正在显示xxhdpi图像(96px x 96px)。两个看起来都很敏锐!

enter image description here

最后,除了mdpi之外,我删除了我的所有图像副本。现在两个模拟器都使用mdpi图像,但您可以看到它们仍以相同的大小显示。图像的内在尺寸为32dp x 32dp,因此即使两个仿真器都使用32px x 32px图像,两者都必须进行扩展(Nexus S必须将其缩放1.5倍,而Nexus 5必须扩展它3×)。

enter image description here

正如您所看到的,小型机器人的大小相同,但看起来更糟糕。这就是为什么你以不同的分辨率提供相同图像的副本:这样你的图像总是显得清晰!