Android自定义View绘制矩形如何保留之前的画布绘制内容?
Android自定义View保留多次绘制矩形的实现方案
问题根因
- 当前的自定义View仅用4个变量存储最新一次的矩形坐标,每次调用
drawNewRect都会覆盖旧坐标 - View的
onDraw方法每次被触发时,Canvas会先清空上一次的绘制内容,仅绘制当前存储的单个矩形,因此只能看到最后一次调用生成的矩形
解决方案:用列表存储所有矩形坐标
修改自定义RectView类,新增集合存储所有历史矩形坐标,每次调用drawNewRect时往集合新增矩形,onDraw时遍历集合绘制所有矩形即可。修改后的代码如下:
import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.RectF import android.content.Context import android.view.View class RectView(context: Context) : View(context) { private val paint = Paint() // 新增集合存储所有历史矩形 private val rectList = mutableListOf<RectF>() init { paint.apply { style = Paint.Style.STROKE strokeWidth = 14f color = Color.BLUE isAntiAlias = true // 可选:开启抗锯齿让边框更平滑 } } fun drawNewRect(left: Float, top: Float, right: Float, bottom: Float) { // 新增矩形到集合,不覆盖旧数据 rectList.add(RectF(left, top, right, bottom)) invalidate() } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) // 遍历集合绘制所有矩形 rectList.forEach { rect -> canvas?.drawRect(rect, paint) } } // 可选扩展:清空所有已绘制的矩形 fun clearAllRect() { rectList.clear() invalidate() } }
外部的调用逻辑不需要做任何修改,运行后即可看到5个依次放大的蓝色矩形。如果需要不同矩形展示不同颜色、线条宽度等样式,可以自定义数据类同时存储矩形坐标和样式属性,替换当前的RectF集合即可。
内容的提问来源于stack exchange,提问作者Hayk Mkrtchyan
相关产品推荐
相关产品推荐

