Android Canvas:绘制太大的位图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Canvas:绘制太大的位图相关的知识,希望对你有一定的参考价值。

我正在运行Ubuntu 16.04。在android Studio上,当我尝试在模拟器中运行应用程序时,出现以下错误:

致命异常:主要流程:此处为项目名称,PID:2528java.lang.RuntimeException:画布:试图绘制太大(216090000bytes)的位图。在android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)在android.graphics.Canvas.drawBitmap(Canvas.java:1415)在android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:528)在android.widget.ImageView.onDraw(ImageView.java:1316)在android.view.View.draw(View.java:17185)在android.view.View.updateDisplayListIfDirty(View.java:16167)在android.view.View.draw(View.java:16951)在android.view.ViewGroup.drawChild(ViewGroup.java:3727)在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)在android.view.View.updateDisplayListIfDirty(View.java:16162)在android.view.View.draw(View.java:16951)在android.view.ViewGroup.drawChild(ViewGroup.java:3727)在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)处等等...

我确实需要经过一些努力才能使我的仿真器正常工作,但是创建一个符号链接需要使我可以在AMD上运行该仿真器。不知道这是否是问题的一部分。对于我的一生,我不知道为什么它会继续这样做。在我的小组中,其他人可以在相同的模拟手机和SDK上很好地模拟项目。

答案

在(高分辨率)可绘制中将图像移动到可绘制-xxhdpi。但是在应用程序开发中,您无需使用大图像。它将增加您的APK文件大小。

另一答案

我有同样的问题。如果您尝试在某些低分辨率设备上上传太大的图像,则该应用将崩溃。您可以制作几张不同大小(hdpi,xxdpi和更多)的图像,或者简单地使用外部库加载能够快速有效地解决问题的图像。我使用了Glide库(您可以使用像Picasso这样的其他库)。

    panel_IMG_back = (ImageView) findViewById(R.id.panel_IMG_back);
    Glide
            .with(this)
            .load(MyViewUtils.getImage(R.drawable.wallpaper)
            .into(panel_IMG_back);
另一答案

解决方案是将图像从drawable/文件夹移动到drawable-xxhdpi/文件夹,正如其他人所提到的。

但是重要的是也要理解为什么这个有点奇怪的建议实际上会有所帮助:

原因是drawable/文件夹存在于android的早期版本中,并且等效于drawable-mdpi。当在drawable/设备上仅使用xxhdpi文件夹中的图像时,可能已经很大的图像将放大3倍,这在某些情况下可能会导致图像的内存占用量爆炸。

另一答案

原来问题是我们当时在应用程序上使用的主要图像。图片的实际尺寸太大,因此我们对其进行了压缩。然后它像魅力一样工作,质量没有损失,并且该应用程序在模拟器上运行良好。

另一答案

[因为此错误就像其他人说的那样,是在可绘制目录中的大图像(1800px X 900px),所以我使用photoshop编辑了图像并按比例缩小了大小,然后开始工作了……!

另一答案

我刚刚创建了目录drawable-xhdpi(您可以根据需要进行更改),然后将粘贴的所有图像复制到该目录中。

另一答案

当我尝试通过launch_backgrgound.xml将初始屏幕添加到android应用程序时,我也遇到了这个问题。问题是解决方案。它太高,因此图像内存占用量爆炸并导致应用程序崩溃,因此是导致此错误的原因。因此,只需使用一个名为nativescript image builder的网站来调整图像大小,这样我就得到了ldpi,mdpi等所有内容,对我来说效果很好。

另一答案

就我而言,我必须删除android平台并再次添加。东西卡住了,将我所有的代码复制到另一个应用程序中就像一种魅力-因此,我的想法是通过删除平台来清理android的构建。

cordova platform remove android
cordova platform add android

我想这是您不时要做的某种清理工作:-(

另一答案

这可能是Glide的问题。在尝试加载许多图像时使用此功能,其中一些图像非常大:

Glide.load("your image path")
                       .transform(
                               new MultiTransformation<>(
                                       new CenterCrop(),
                                       new RoundedCorners(
                                               holder.imgCompanyLogo.getResources()
                                                       .getDimensionPixelSize(R.dimen._2sdp)
                                       )
                               )
                       )
                       .error(R.drawable.ic_nfs_default)
                       .into(holder.imgCompanyLogo);
           
另一答案

如果您使用Picasso将这样更改为Glide。

删除毕加索

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

更改滑行

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

比毕加索绘制大位图时更有效的滑行

以上是关于Android Canvas:绘制太大的位图的主要内容,如果未能解决你的问题,请参考以下文章

canvas.drawBitmap 仅绘制最后修改的位图,不绘制中间图

Android 清除画布上绘制的位图

Android自定义View学习五---图片文本绘制

Android面试收集录 2D绘图与动画技术

Canvas绘图优化之使用位图--基于createjs库

启动 Xamarin.forms 应用程序时出错:尝试绘制太大(165514752 字节)位图