Android Studio绘图调色板异常求助:切换颜色后所有绘图内容变色
问题根源分析
你遇到的核心问题是没有将绘制的路径与对应的颜色绑定存储,当前代码每次重绘时只是根据路径列表的索引循环从颜色列表取色,而非每个路径对应它绘制时的颜色。另外原代码里onDraw中调用invalidate()会导致无限重绘,这也是需要修正的点。
ChatGPT给的代码逻辑完全错误:它用lastColorIndex累加的方式计算颜色,每次重绘都会重新给所有路径分配新的颜色序列,自然无法保留原有绘制的颜色。
解决方案
正确的做法是创建一个数据结构,把每个路径和它对应的颜色绑定在一起,具体步骤如下:
- 创建绑定路径与颜色的数据类
public class DrawData { public Path path; public int color; public DrawData(Path path, int color) { this.path = path; this.color = color; } }
- 替换原有的路径列表
把原来的List<Path> pathList1替换为List<DrawData> drawDataList1,当用户选择颜色并开始绘制时,将新创建的Path和当前选中的颜色一起存入这个列表:
// 示例:用户选择颜色后开始绘制的逻辑 int currentSelectedColor = ...; // 当前选中的颜色 Path newPath = new Path(); // 初始化path的起点等操作 drawDataList1.add(new DrawData(newPath, currentSelectedColor));
- 修正onDraw方法
遍历绑定后的列表,每个条目使用对应的颜色绘制路径,同时移除导致无限重绘的invalidate():
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 调用父类方法保证视图绘制流程正常 for (DrawData data : drawDataList1) { paint_brush.setColor(data.color); canvas.drawPath(data.path, paint_brush); } // 移除原来的invalidate(),避免无限重绘 }
额外说明
- 原代码中
i % colorList1.size()的逻辑是按路径索引循环取色,这本身就不是“保存每个路径绘制时的颜色”的逻辑,所以切换颜色后重绘会给所有路径重新分配颜色,导致旧内容变色。 - 双区域绘图的话,给另一个区域也创建对应的
List<DrawData>即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Its_driina
相关产品推荐
相关产品推荐

