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

自定义View调用invalidate重绘残留旧纹理,多边形边数变更重复绘制问题求助

解决自定义View重复绘制的问题

首先,大概率你是在修改多边形边数的时候,不小心重复创建了PolygonView的实例,还把它重新添加到了布局里——而不是直接更新已有View的边数属性,再调用invalidate()触发重绘。我给你梳理几个排查和修复的关键点:

1. 检查Fragment2中修改边数的核心逻辑

先看看你是不是每次调整边数时都写了类似这样的错误代码:

// 错误示例:每次修改都新建View并添加到布局
PolygonView newPolygon = new PolygonView(getContext());
newPolygon.setSides(newSideCount);
containerLayout.addView(newPolygon);

如果是这样,那每次修改边数都会新增一个View叠加在原来的上面,视觉上就会呈现“重复绘制新View”的效果。

正确的做法是复用已有的PolygonView实例:

  • 先通过findViewById获取布局中已经存在的PolygonView对象
  • 直接更新它的边数属性
  • 最后调用invalidate()触发重绘

示例代码如下:

// 正确示例:复用已有View更新属性并重绘
PolygonView polygonView = findViewById(R.id.polygon_view);
polygonView.setSides(newSideCount);
polygonView.invalidate();

2. 确保PolygonView的onDraw方法清除旧绘制内容

如果你的onDraw方法没有先清除画布上的旧内容,也会导致新图形叠加在旧图形上,看起来像重复绘制。记得在onDraw开头加上清除画布的逻辑:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 先清除画布上的旧绘制内容(用你需要的背景色)
    canvas.drawColor(Color.WHITE);
    // 再绘制新的多边形
    drawPolygon(canvas);
}

3. 排查是否存在重复触发添加View的逻辑

比如你可能在SeekBar的滑动监听、或者Fragment的生命周期方法(如onResume)里重复执行了添加View的代码。可以加个日志输出,看看每次修改边数时,是不是多次调用了添加View的逻辑。

快速验证问题根源

你可以给PolygonView设置一个半透明的背景色,然后修改边数:

  • 如果看到多个半透明的图形叠加,那肯定是重复添加了View;
  • 如果只有一个背景,但图形叠加,那就是onDraw没清画布的问题。

内容的提问来源于stack exchange,提问作者divyanshu bhargava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:27:33