"Canvas: trying to draw too large bitmap" 当 Android N 显示尺寸设置大于小

"Canvas: trying to draw too large bitmap" when Android N Display Size set larger than Small

当新引入的 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 会使您的设备表现得像一个体积更小但像素密度更高的设备。但我不明白我应该在这里做什么。如果我为逐渐提高的分辨率放入逐渐变小的图像,它在实际大显示器上看起来不会很好。还是我没听懂?

任何指点将不胜感激。

我的情况是,将(高分辨率)启动位图从 drawable 移动到 drawable-xxhdpi解决方案。

我遇到了同样的问题。我不怀疑我的启动画面是问题所在,因为它 在应用程序启动时显示的,但事实证明启动画面是问题所在。

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

尝试使用Bitmap.Factoryclass,这个link会对你有帮助 Loading Large Bitmaps Efficiently

我不知道它是否对某些人有帮助,但我就把它留在这里。 就我而言 - 问题仅出现在 Android 7 的 Sumsung 设备上,问题出在闪屏比例上。将高度更改为 1024 像素后 - 一切正常

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

图标文件太大,Android 无法高效流畅地加载。 Android 通过其智能算法识别这一点。

您可以通过 asystat 使用 Final Android Resizer 调整图标文件的大小。将它们调整为 "xhdpi" 或更小。

将调整大小的照片放在可绘制文件中或覆盖现有的大图标文件。

那么,大功告成。

如果您正在使用 glide 并且一次加载 1k 的图像或一些图像,那么这是 glide 的问题或您正在做的任何用于设置图像视图的问题。你可以通过在滑行中应用缩放类型来解决它。

android: 行之间的 Manifest 文件的应用程序标记中添加以下代码后,我解决了这个问题。

android:hardwareAccelerated="false"

在我的例子中,我只是使用 Paint3d 更改了背景中使用的图像的 canvas(或者您可以使用任何其他图像)。 Here I am sharing a screenshot just go through it.

如果你用 Picasso 换成 Glide 像这样。

删除毕加索

Picasso.get().load(Uri.parse("url")).into(imageView)

改变滑行

Glide.with(context).load("url").into(imageView)

更高效

通过将图像尺寸调整为较小尺寸解决。

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

如上面设置的bay

android:hardwareAccelerated="false"

会导致UI体验不好,可以设置hardwareAccelerated 只选择一个Activity要绘制高分辨率图像的地方

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

需要在 android 之间添加 Manifest 文件应用程序标记:添加以下行。

android:hardwareAccelerated="false"