自定义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
相关产品推荐
相关产品推荐

