我正在运行 Ubuntu 16.04。在 Android Studio 上,当我尝试在模拟器中运行我的应用程序时,我收到以下错误:
致命异常:主进程:这里的项目名称,PID:2528 java.lang.RuntimeException:画布:试图绘制太大(216090000字节)位图。在 android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260) 在 android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:528) 在 android.graphics.Canvas.drawBitmap(Canvas.java:1415) 在 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.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 上很好地模拟该项目。
BitmapOption.inSampleSize
读取较小尺寸的位图?
将(高分辨率)drawable 中的图像移动到drawable-xxhdpi。但是在应用程序开发中,您不需要使用大图像。它会增加您的 APK 文件大小。
解决方案是将图像从 drawable/
文件夹移动到 drawable-xxhdpi/
文件夹,正如其他人所提到的。
但同样重要的是要理解为什么这个有点奇怪的建议实际上有帮助:
原因是 drawable/
文件夹存在于早期版本的 android 中,并且等同于 drawable-mdpi
。当在 xxhdpi
设备上使用仅位于 drawable/
文件夹中的图像时,可能已经很大的图像会放大 3 倍,这在某些情况下会导致图像的内存占用爆炸。
drawable-x
目录中有资产,我可以删除 drawable/
目录?
这个解决方案对我有用。
在您的清单应用程序标签中添加这些行
android:largeHeap="true"
android:hardwareAccelerated="false"
我有同样的问题。如果您尝试在某些低分辨率设备上上传太大的图像,应用程序将崩溃。您可以制作多个不同大小的图像(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);
原来问题出在我们当时在应用程序上使用的主图像上。图片的实际尺寸太大,所以我们压缩了它。然后它就像一个魅力,没有质量损失,应用程序在模拟器上运行良好。
这个问题可以通过以下3种方法解决:
方法 1:通过将图像添加到 res/drawable-nodpi 文件夹中(这样做不会预先缩放您的图像)。
方法二:生成图片的所有dpi(hdpi,ldpi,mdpi,xhdpi,xxhdpi,xxxhdpi)并添加到drawable文件夹中。 (这个过程会增加 APK 的大小)。
方法 3:将图像添加到 drawable/drawable-xxhdpi 文件夹。
所有这些方法都经过验证。
因为这个错误就像其他人说的一个大图像(1800px X 900px)在drawable目录中,我编辑了图像并使用photoshop按比例缩小了它的大小,它工作......!!
如果您使用 Picasso 更改为 Glide 像这样。
删除毕加索
Picasso.get().load(Uri.parse("url")).into(imageView)
改变滑行
Glide.with(context).load("url").into(imageView)
Glide 比 Picasso 绘制到大位图更有效
当我尝试通过 launch_backgrgound.xml 向 android 应用程序添加启动画面时,我也遇到了这个问题。问题是决议。它太高了,所以图像内存占用爆炸并导致应用程序崩溃,因此导致此错误。所以只需使用一个名为 nativescript image builder 的网站调整图像大小,这样我就得到了 ldpi、mdpi 和所有其他文件,它对我来说很好用。
如果您不希望对图像进行预缩放,可以将其移动到 res/drawable-nodpi/
文件夹。
更多信息:https://developer.android.com/training/multiscreen/screendensities#DensityConsiderations
我刚刚创建了目录drawable-xhdpi(您可以根据需要更改它)并将所有图像复制粘贴到该目录。
这可能是 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);
}
尝试使用 xml 或矢量资源而不是 jpg 或 png。
原因在异常名称本身中非常明显,即资源的分辨率太大而无法呈现。
您可以使用 https://svg2vector.com/ 等在线工具将图像 png 转换为 xml,或者将图像添加到 drawable-xxhdpi 文件夹。
Picasso 的解决方案是添加转换以调整图像大小。
class ResizeTransformation(private val maxSize: Int) : Transformation {
override fun transform(source: Bitmap?): Bitmap? {
var result:Bitmap? = null
if (source != null) {
var width = source.width
var height = source.height
val bitmapRatio = width.toFloat() / height.toFloat()
if (bitmapRatio > 1) {
width = maxSize;
height = (width / bitmapRatio).toInt()
} else {
height = maxSize;
width = (height * bitmapRatio).toInt()
}
result = Bitmap.createScaledBitmap(source, width, height, true)
source.recycle()
}
return result
}
override fun key() = "resize()"
}
利用:
Picasso.get()
.load(url)
.transform(ResizeTransformation(2400)) //FHD+ resolution
.into(view)