当新引入的Display size
操作系统设置设置为过大的值时,我发布了一个在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
会导致您的设备像具有更高像素密度的物理上更小的设备一样运行。但我不明白我应该在这做什么。如果我逐渐增加较小的图像以逐渐提高分辨率,那么在实际大型显示器上看起来不会很好。或者我不明白什么?
任何指针都会非常感激。
答案 0 :(得分:121)
我的情况是,将(高分辨率)启动位图从 drawable 移动到 drawable-xxhdpi 是解决方案。
我遇到了同样的问题。我没有怀疑我的启动画面是问题,因为在启动应用程序时显示 ,但事实证明启动画面是问题。
在我的情况下,启动画面具有xxhdpi分辨率,并且它被错误地放在 drawable 文件夹中,而不是 drawable-xxhdpi 。这使Android假设启动画面具有mdpi分辨率,并将图像缩放到所需大小的3 * 3倍并尝试创建位图。
答案 1 :(得分:10)
我不知道会对某人有所帮助,但我会把它放在这里。 在我的情况下 - 问题只出现在使用Android 7的Sumsung设备上,并且问题在于闪屏比例。将高度更改为1024 px后 - 一切正常
答案 2 :(得分:9)
将您在drawable中的图像移动到mipmap-xxhdpi。您的图像是位图格式,因此您应该将图像放在mipmap文件夹中,然后它将起作用
答案 3 :(得分:3)
尝试使用Bitmap.Factory类,此链接将帮助您 Loading Large Bitmaps Efficiently
答案 4 :(得分:2)
就我而言,我在清单文件的android:hardwareAccelerated="false"
中添加了applicationg
后解决了问题。
答案 5 :(得分:2)
如果您使用Picasso像这样将Glide更改为Glide。
删除毕加索
Picasso.get().load(Uri.parse("url")).into(imageView)
更改滑行
Glide.with(context).load("url").into(imageView)
更高效
答案 6 :(得分:1)
在某些情况下,原始位图需要绘制到ImageViews,照片编辑应用程序等中,
如上述设置中的托架
android:hardwareAccelerated="false"
将导致不良的UI体验,您可以将hardwareAccelerated设置为仅选择一个要绘制高分辨率图像的活动
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
答案 7 :(得分:0)
图标文件太大,无法让Android高效,流畅地加载。 Android通过其智能算法识别出这一点。
您可以使用asystat使用Final Android Resizer调整图标文件的大小。将它们调整为“xhdpi”或更低。
将已调整大小的照片放在可绘制或覆盖现有的大图标文件上。
然后,你已经完成了。
答案 8 :(得分:0)
如果使用滑行,并且一次加载1k图像或某些图像,则是滑行问题或用于设置图像视图的任何操作。您只需在滑行中应用比例类型即可解决该问题。
答案 9 :(得分:0)
就我而言,我只是使用Paint3d更改了在背景中使用的图像画布(或者您可以使用其他任何画布)。 Here I am sharing a screenshot just go through it.
答案 10 :(得分:0)
可以通过将图像调整为较小的尺寸来解决。
答案 11 :(得分:0)
我检查了Logcat
进程:co.coolresume,PID:11145 java.lang.RuntimeException:画布:试图绘制太大的(572166144bytes)位图。 在android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229) 在android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:97) 在android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:529) 在android.widget.ImageView.onDraw(ImageView.java:1367) 在android.view.View.draw(View.java:19380)
我使用下一个清单解决了错误
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:hardwareAccelerated="false">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>