画布绘制位图在Android 10上崩溃,但在Android 8上不崩溃

问题描述

我使用画布绘制位图,并使用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"禁用硬件加速,它可以在ApplicationActivity中使用;

或者您可以将这种方法用于一个特定的View,例如

view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);