当Android N显示尺寸设置大于小时,"画布:尝试绘制太大的位图"

Bri*_*Rak 63 layout android android-7.0-nougat

我有一个已发布的应用程序,当新引入的Display size操作系统设置设置为太大值时,在Android N上启动时崩溃.

当我查看logcat时,我看到以下消息:

java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap.
Run Code Online (Sandbox Code Playgroud)

我在第一个Activity中将问题跟踪到ImageView,它显示了一个漂亮的大背景图像.有问题的图像是2048x1066,位于我的通用drawables目录中,因此无论密度如何,都将使用此图像.

Display size设置为时,一切正常Small.但是当我上去时Default,它就会停止工作.如果我然后用较小的图像交换图像,它可以工作Default,但如果我去Large,它会再次停止工作.

我的猜测是,调整Display size会使您的设备表现得像具有更高像素密度的物理上更小的设备.但我不明白我应该在这做什么.如果我逐渐增加较小的图像以逐渐提高分辨率,那么在实际大型显示器上看起来不会很好.或者我不明白什么?

任何指针都将非常感激.

Joh*_*zén 136

我的情况下,将(高分辨率)飞溅位图从drawable移动drawable-xxhdpi是解决方案.

我有同样的问题.我不怀疑我的启动画面是问题,因为它当应用程序开始显示出来,但事实证明,闪屏的问题.

在我的情况下,启动画面有xxhdpi分辨率,它被错误地放在drawable文件夹中,而不是drawable-xxhdpi.这使Android假设启动画面具有mdpi分辨率并将图像缩放到所需大小的3*3倍并尝试创建位图.


kaz*_*mad 11

我不知道它会对某人有所帮助,但我会把它放在这里.在我的情况下 - 问题只出现在使用Android 7的Sumsung设备上,并且问题在于闪屏比例.将高度改为1024 px后 - 一切正常

  • 我在使用 Android 7 的一些 SAMSUNG S6、S6 Active 上遇到了这个问题。因此我使用 Firebase 进行了进一步分析,发现所有这些设备的 DPI 设置都高于 500。然后我找到了一种在模拟器中重现此问题的方法(我使用MEMU 这里),我将模拟器设置为与 Galaxy S6 完全相同的屏幕分辨率“2560x1440,DPI 577”,并且我的应用程序按预期产生了错误。这是由高 DPI 引起的,许多 SAMSUNG 设备都有高 DPI 设置。我将高分辨率位图图像放置在“drawable”中,它仅适用于 DPI 小于 500 的设备。将它们移至“-xxhdpi-v4”即可修复。 (3认同)

小智 10

在将以下代码添加到android:行之间的Manifest文件的application标签后,我解决了问题。

android:hardwareAccelerated="false"
Run Code Online (Sandbox Code Playgroud)

  • 这将导致禁用 CardView 的所有高度。因此,正确的解决方案是将位图缩放到较小的尺寸。 (7认同)
  • 不要这样做,它会减慢你的应用程序的速度。 (6认同)
  • 与其在应用程序级别禁用硬件加速,不如在活动、窗口、视图级别中控制硬件加速会更有用。 (3认同)
  • 好吧,花了几个小时后,此解决方案可解决小米和三星的移动问题。 (2认同)

kal*_*age 9

将您在drawable中的图像移动到mipmap-xxhdpi.您的图像是位图格式,因此您应该将图像放在mipmap文件夹中,然后它将工作

  • AFAIK mipmap 文件夹仅用于启动器图标。我从未将它用于其他任何用途。请参阅/sf/answers/1964596511/ (2认同)

Bal*_*tty 6

在某些情况下,原始位图需要绘制到 ImageView、照片编辑应用程序等中......,

正如上面提到的海湾设置

android:hardwareAccelerated="false"
Run Code Online (Sandbox Code Playgroud)

会导致糟糕的 UI 体验,您可以设置 hardwareAccelerated 仅选择一个要绘制高分辨率图像的 Activity

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>
Run Code Online (Sandbox Code Playgroud)