Android Canvas画布saveLayer与对应restoreToCount,Kotlin

亦凉 2024-02-05 17:36 109阅读 0赞

Android Canvas画布saveLayer与对应restoreToCount,Kotlin

  1. private fun mydraw() {
  2. val originBmp = BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)
  3. val newBmp = Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.ARGB_8888)
  4. val canvas = Canvas(newBmp)
  5. //把原图绘制在画布Canvas
  6. canvas.drawBitmap(originBmp, 0f, 0f, null)
  7. iv?.setImageURI(Uri.fromFile(saveBitmapToFile(newBmp)))
  8. val paint = Paint(Paint.ANTI_ALIAS_FLAG)
  9. paint.color = Color.RED
  10. paint.textSize = 40f
  11. paint.style = Paint.Style.STROKE
  12. paint.strokeWidth = 2f
  13. paint.textAlign = Paint.Align.LEFT
  14. //新图层,绿色背景,红色圆圈。
  15. val layer1 = canvas.saveLayer(0f, 0f, canvas.width.toFloat(), (canvas.height.toFloat() * 0.9).toFloat(), null)
  16. canvas.drawColor(Color.GREEN)
  17. canvas.drawCircle((canvas.width / 2).toFloat(), (canvas.height / 2).toFloat(), 50f, paint)
  18. canvas.restoreToCount(layer1)
  19. iv1?.setImageURI(Uri.fromFile(saveBitmapToFile(newBmp)))
  20. //新图层,灰色背景,直线。
  21. val layer2 = canvas.saveLayer(0f, 0f, canvas.width.toFloat(), (canvas.height.toFloat() * 0.8).toFloat(), null)
  22. canvas.drawColor(Color.GRAY)
  23. canvas.drawLine(
  24. canvas.width.toFloat() / 2,
  25. canvas.height.toFloat() / 2,
  26. canvas.width.toFloat(),
  27. canvas.height.toFloat(),
  28. paint
  29. )
  30. canvas.restoreToCount(layer2)
  31. iv2?.setImageURI(Uri.fromFile(saveBitmapToFile(newBmp)))
  32. //新图层,绿色背景,文字fly
  33. val layer3 = canvas.saveLayer(0f, 0f, canvas.width.toFloat(), (canvas.height.toFloat() * 0.5).toFloat(), null)
  34. canvas.drawColor(Color.BLUE)
  35. val x = 50f
  36. val y = 150f
  37. canvas.drawText("fly", x, y, paint)
  38. canvas.restoreToCount(layer3)
  39. iv3?.setImageURI(Uri.fromFile(saveBitmapToFile(newBmp)))
  40. /**
  41. * 如果不事先把bitmap通过文件形式存放好,再通过setImageURI设置到ImageView,那么就像
  42. * iv4?.setImageBitmap(newBmp),设置的newBmp是最终的绘图结果,saveLayer与restoreToCount操作的是在内存的newBmp,
  43. * 即便是ivx?.setImageURI后,newBmp内存数据变化,最终都是iv4里面的显示。为了细致观察这种区别,才先保存成不变的文件,再读文件加载出来观察。
  44. *
  45. * 注意,因为restoreToCount了,图层叠加到原图上,所以显示的结果是最后面的叠加到最前面的,把最前面的遮住了。
  46. * 如果不restoreToCount,则不会叠加,因为saveLayer创建了一个透明图层,是在原图之上的绘制。
  47. */
  48. iv4?.setImageBitmap(newBmp)
  49. }
  50. private fun saveBitmapToFile(bm: Bitmap): File? {
  51. var saveFile: File? = null
  52. val savePath =
  53. Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString()
  54. if (!Files.exists(Paths.get(savePath))) {
  55. Log.d("保存文件", "${savePath}不存在!")
  56. } else {
  57. saveFile = File(savePath, System.currentTimeMillis().toString() + ".jpeg")
  58. try {
  59. val saveImgOut = FileOutputStream(saveFile)
  60. //压缩
  61. bm.compress(Bitmap.CompressFormat.JPEG, 90, saveImgOut)
  62. saveImgOut.flush()
  63. saveImgOut.close()
  64. Log.d("保存文件", "Bitmap保存至 ${saveFile.absoluteFile.toPath()}")
  65. } catch (e: Exception) {
  66. e.printStackTrace()
  67. }
  68. }
  69. return saveFile
  70. }

71d48cb2403e4c3b84dd093fedca0d22.png

如果把

  1. canvas.restoreToCount()

全部注释掉,则为

83132b1386dc48c3ba0593f4bc0d4965.png

Android Canvas状态save与restore,Kotlin-CSDN博客文章浏览阅读218次,点赞3次,收藏3次。文章浏览阅读9.6k次。文章浏览阅读1.8k次。/*Java代码 将Drawable转化为Bitmap */ Bitmap drawableToBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth();Android Material Design :LinearLayoutCompat添加分割线divider_linearlayout 分割线-CSDN博客。favicon32.icohttps://blog.csdn.net/zhangphil/article/details/135113616

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android Canvas画布

    在本教程中,我们将讨论 Android 的一个非常重要的部分,即 Canvas。这是每个开发人员都喜欢远离的领域。本教程的目的是让您更加了解和轻松使用 Android Canv

    相关 canvas画布

    canvas标签 <canvas></canvas> 接下来使用支持H5的浏览器打开该页面,将会看到如下内容: ![在这里插入图片描述][watermark

    相关 canvas-画布

    概述 HTML5 的 canvas 元素用于定义画布,是一个矩形区域,默认颜色为白色,默认大小为 300 \ 150;通过 JavaScript 可以在该区域上绘制图像