Android 多重拉伸的优点是什么?

Android 多重拉伸的优点是什么?,android,Android,大多数参考资料都指出,当我们使用(ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi)时,android不需要重新缩放图像,我们也不会有用于重新缩放图像的cpu开销 但我还没有明白这一点,假设我有一个图标图像,所有尺寸都是前面提到的(36px、48px、72px、96px、144px和192px),那么,在下面的代码中,你可以看到我使用的是40dp,它与上面的任何尺寸都不匹配,所以安卓会再次重新缩放图像,那么如果有多个可绘制的图像,又有什么好处呢 <ImageView

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

但我还没有明白这一点,假设我有一个图标图像,所有尺寸都是前面提到的(36px、48px、72px、96px、144px和192px),那么,在下面的代码中,你可以看到我使用的是40dp,它与上面的任何尺寸都不匹配,所以安卓会再次重新缩放图像,那么如果有多个可绘制的图像,又有什么好处呢

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

对于布局中描述的DPs,您通常无法获得与之精确像素匹配的图像,就像上面描述的情况一样。当这种情况发生时,Android仍然需要进行一些扩展

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

如果您从一个非常接近的图像开始,只需要进行一点缩放,那么内存成本就不那么重要了

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

4字节x 250000=1M内存。 XXXHDPI设备上的500px在屏幕上只有约1英寸。 因此,您可以看到这是如何快速累积的


编辑:这可能很有用

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

您的问题提到了图像的特定像素尺寸。我假设这些值取自

  • 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的
新建->图像资源
菜单来创建图像。您可以看到,AS生成同一图像的多个不同尺寸的副本:

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

  • Nexus S(hdpi):
  • Nexus 5(xxhdpi):
然后,我运行一个应用程序,在两个屏幕上都显示我的图像:

您可以看到,状态栏、操作栏和小android都显示相同的大小。但是Nexus S显示hdpi图像(48px x 48px),而Nexus 5显示xxhdpi图像(96px x 96px)。两个看起来都很锋利

最后,我删除了除mdpi之外的所有图像副本。现在,两个模拟器都使用mdpi映像,但您可以看到它们仍然以相同的大小显示。映像的固有大小为32dp x 32dp,因此即使两个模拟器都使用32px x 32px映像,它们都必须将其放大(Nexus s必须将其放大1.5倍,Nexus 5必须将其放大3倍)


正如你所看到的,小安卓的尺寸是一样的,但是它看起来更糟糕。这就是为什么您提供不同分辨率的相同图像的副本:以便您的图像始终显示清晰

当你们说40dp时,你们指的是与密度无关的像素,所以它们会根据设备进行缩放。当你有一个高分辨率的图像,它将需要更多的计算能力来缩小到一个低分辨率的电话我想他说的是,即使在转换DP->PX之后,没有一个图标大小排成一行,所以一定量的缩放是必要的。这是真的。投反对票,因为我认为你没有很好地阅读问题和阿隆的答案!还有你回答的错误。如果唯一的优势是你所说的,我们可以只使用高分辨率(xxhdpi)的图像,让android缩小到所需的大小。@programmer1我不知道你的意思。如果您只提供xxhdpi映像,系统将在mdpi设备上对其进行缩小。当然,缩小后的图像看起来不会像最初为mdpi设备制作的图像那么好。我不明白这是什么意思。重新调整规模是不可避免的。在实际项目中,几乎不可能对我们的图像使用完全相同的可绘制尺寸。我们完全可以自由选择图像小部件的宽度和高度,在drawable文件夹中,我们没有从1px.1px到1000px.1000px的所有图像大小,以避免重新缩放。此外,我没有看到缩小规模的重大变化。你说的话有什么可参考的理由吗?如果我弄错了,请多解释。谢谢。谢谢你更新答案,但我们的讨论是关于缩小规模而不是扩大规模。请改为mdpi图像,只需保留xxxhdpi图像并再次测试。您将看到结果将出现