You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:30:01