【发布时间】:2016-12-30 21:02:53
【问题描述】:
当新引入的Display size OS 设置设置为太大时,我有一个已发布的应用程序在 Android N 上启动时崩溃。
当我查看 logcat 时,我看到以下消息:
java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap.
我在我的第一个 Activity 中将问题追溯到一个 ImageView,它显示了一个漂亮的大背景图像。有问题的图像为 2048x1066,位于我的通用 drawables 目录中,因此无论密度如何,都将使用此图像。
当Display size 设置为Small 时,一切正常。但是当我上升到Default 时,它停止工作。如果我然后将图像换成较小的图像,它可以在Default 工作,但如果我升级到Large,它会再次停止工作。
我的猜测是,向上调整 Display size 会使您的设备表现得像一个物理上更小但像素密度更高的设备。但我不明白我应该在这里做什么。如果我将逐渐变小的图像放入越来越高的分辨率,那么它在真正的大显示器上看起来并不好。还是我不明白什么?
任何指针将不胜感激。
【问题讨论】:
-
"有问题的图像是 2048x1066 并且在我的通用 drawables 目录中,所以无论密度如何,都会使用这个图像" --
res/drawable/是res/drawable-mdpi/的同义词。如果您不希望图像根据密度进行缩放,useres/drawable-nodpi/orres/drawable-anydpi/。 -
“你是说一个 100x100 像素的图像存在于各种不同的资源目录中,实际上是在进行布局之前对其进行缩放以创建一个不同分辨率的虚拟版本?” - 这取决于您拥有的密度和运行的设备。如果存在完全匹配,则不会重新采样。如果不完全匹配,则重新采样附近密度的图像。所以,如果你只有
res/drawable/foo.png(又名res/drawable-mdpi/foo.png),而你的设备是xhdpi,图像将沿两个轴翻倍,占用4倍内存。 -
错误中的 106975232 值恰好是图像分辨率的 49 倍,这意味着沿两个轴进行了 7 倍的重采样。这比我预期的要高得多。我还没有机会使用 Android 7.0 中的显示尺寸设置,所以我将把它添加到我不断增长的待办事项列表中......
-
在 49 倍上不错!我想我可以解释为什么它这么高。请记住,该数字是字节。该图像是 24 位的,但它可能以每像素 32 位的速度读入。这将使其在内存中为 8732672 字节,恰好是该数字的 12.25 倍,这反过来意味着沿每个轴缩放 3.5 倍。这个设备是 xxhdpi,所以看起来它可能是正确的。无论哪种方式,我都不知道资源会像这样被重新采样。感谢您的帮助! (顺便说一句,将图像移动到 drawable-nodpi 确实可以解决它。)
-
你真的应该接受约翰的回答
标签: android layout android-7.0-nougat