问题描述
我使用画布绘制位图,并使用android 8和10两个版本进行测试。某种程度上android 10崩溃了,但我似乎不明白此错误消息:
java.lang.IllegalArgumentException:软件渲染不支持硬件位图
下面是我的代码。崩溃在此行上:canvas.drawBitmap(bitmap1,0F,0F,null)
private fun DrawRectTextAndBitmap()
{
val strOwnerName: String = "Owner: " + tvOwnerName.text.toString()
val strCtcName:String = "Contact : " + tvCtcPersonName.text.toString()
val strCtcMobileNo:String ="Mobile : " + tvCtcPersonMobile.text.toString()
val sTraddr1 : String ="Drug Allergy : " + tvAddr1.text.toString()
val sTraddr2: String = "Food Allergy : " + tvAddr2.text.toString()
val bitmap1 = (imgResult.getDrawable() as BitmapDrawable).getBitmap()
var h = bitmap1.height
var w = bitmap1.width
val newbitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888)
val canvas = Canvas(newbitmap)
//-- draw background color
canvas.drawColor(Color.GREEN)
//-- draw bitmap onto Canvas:
canvas.drawBitmap(bitmap1,0F,null)
//-- create paint-based color
val paint = Paint()
paint.isAntiAlias()
paint.setColor(ContextCompat.getColor(applicationContext,R.color.royalblue))
paint.alpha = 126
val strdisplayAllText: String = strOwnerName
val paintText = Paint(Paint.ANTI_ALIAS_FLAG)
paintText.setTextSize(rectTextSize)
paintText.setColor(ContextCompat.getColor(applicationContext,R.color.Lightgray))
paintText.setStyle(Paint.Style.FILL)
val color1 = Color.parseColor("#f5f5f5")
paintText.setColor(color1)
paintText.setStyle(Paint.Style.FILL)
//-- Draw the Rectangle
if (h > w ) {
val rectangle = Rect(10,rectPortrait_StartPoint,rectPortrait_H,rectPortrait_W)
canvas.drawRect(rectangle,paint)
} else {
val rectangle = Rect(10,rectLandscape_StartPoint,rectLandscape_H,rectLandscape_W)
canvas.drawRect(rectangle,paint)
}
val rectText = Rect()
paintText.getTextBounds(strOwnerName,strdisplayAllText.length,rectText)
if( h > w ) {
canvas.drawText(strOwnerName,20F,830F,paintText)
canvas.drawText(strCtcName,890F,paintText)
canvas.drawText(strCtcMobileNo,950F,paintText)
canvas.drawText(sTraddr1,1010F,paintText)
canvas.drawText(sTraddr2,1110F,paintText)
val density = Resources.getSystem().displayMetrics.density
imgResult.layoutParams.height = 240 * density.toInt()
imgResult.layoutParams.width = 180 * density.toInt()
imgResult.requestLayout()
}else{
//--landscape
canvas.drawText(strOwnerName,560F,620F,680F,740F,870F,paintText)
val density = Resources.getSystem().displayMetrics.density
imgResult.layoutParams.width = 200 * density.toInt()
imgResult.layoutParams.height = 200 * density.toInt()
imgResult.requestLayout()
}
runOnUiThread {
imgResult.setimageBitmap(newbitmap)
}
}
1) in manifest
I added :
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:hardwareAccelerated="false"
</application>
2 ) in code,I modified for the ImageView
imgResult.setimageBitmap(newbitmap)
imgResult.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
解决方法
来自Canvas类:
private void throwIfHwBitmapInSwMode(Bitmap bitmap) {
if (!isHardwareAccelerated() && bitmap.getConfig() == Bitmap.Config.HARDWARE) {
onHwBitmapInSwMode();
}
}
因此使用配置软件制作位图,或启用硬件加速
,您应该通过标签android:hardwareAccelerated="false"
禁用硬件加速,它可以在Application
和Activity
中使用;
或者您可以将这种方法用于一个特定的View
,例如
view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);