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

Android带图层绘图应用Path存入ArrayList后Canvas不绘制问题

问题根因

你遇到的两个问题核心原因如下:

  1. 路径存储逻辑错误:Path属于引用类型,你直接将全局的mPath添加到图层列表后立即调用reset(),列表中存储的是mPath的内存引用,因此reset()会同时清空列表中已经保存的路径,导致重绘时无路径可画,线条直接消失。
  2. 实时轨迹未绘制:onDraw方法只遍历绘制了已存入图层列表的路径,没有绘制当前正在编辑、还未存入列表的mPath,因此滑动绘制过程中看不到实时轨迹。你看到的后续绘制过程有轨迹、完成后短暂显示都是系统视图的临时缓存效果,不是你自身渲染逻辑实现的,重绘触发后缓存就会被清空。
修复方案

只需要修改两处代码即可解决所有问题:

1. 修改onTouchEvent中ACTION_UP的存储逻辑

将原有的直接添加mPath改为添加mPath的拷贝对象,避免reset()操作影响已保存的路径:

case MotionEvent.ACTION_UP:
    // 生成当前路径的拷贝再存入图层列表
    Path savedPath = new Path(mPath);
    path.add(savedPath);
    mPath.reset();
    break;

2. 修改onDraw逻辑,新增实时轨迹绘制

在遍历完所有图层的路径后,新增当前正在编辑的mPath的绘制:

// 遍历每个图层的ArrayList,将其中所有Path绘制到Canvas上
for (Path path : layer1) {
    canvas.drawPath(path, paintLine);
}
for (Path path : layer2) {
    canvas.drawPath(path, paintLine);
}
for (Path path : layer3) {
    canvas.drawPath(path, paintLine);
}
// 新增:绘制当前正在绘制的路径,实现滑动时实时显示轨迹
canvas.drawPath(mPath, paintLine);
canvas.restore();

修改完成后,已绘制的路径会持久保存在对应图层的列表中不会被清空,滑动过程中也能实时看到绘制轨迹。

内容的提问来源于stack exchange,提问作者Grim Reaper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:45:02