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

Android Studio绘图调色板异常求助:切换颜色后所有绘图内容变色

问题根源分析

你遇到的核心问题是没有将绘制的路径与对应的颜色绑定存储,当前代码每次重绘时只是根据路径列表的索引循环从颜色列表取色,而非每个路径对应它绘制时的颜色。另外原代码里onDraw中调用invalidate()会导致无限重绘,这也是需要修正的点。

ChatGPT给的代码逻辑完全错误:它用lastColorIndex累加的方式计算颜色,每次重绘都会重新给所有路径分配新的颜色序列,自然无法保留原有绘制的颜色。

解决方案

正确的做法是创建一个数据结构,把每个路径和它对应的颜色绑定在一起,具体步骤如下:

  1. 创建绑定路径与颜色的数据类
public class DrawData {
    public Path path;
    public int color;

    public DrawData(Path path, int color) {
        this.path = path;
        this.color = color;
    }
}
  1. 替换原有的路径列表
    把原来的List<Path> pathList1替换为List<DrawData> drawDataList1,当用户选择颜色并开始绘制时,将新创建的Path和当前选中的颜色一起存入这个列表:
// 示例:用户选择颜色后开始绘制的逻辑
int currentSelectedColor = ...; // 当前选中的颜色
Path newPath = new Path();
// 初始化path的起点等操作
drawDataList1.add(new DrawData(newPath, currentSelectedColor));
  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:23:28