Android带图层绘图应用Path存入ArrayList后Canvas不绘制问题
问题根因
你遇到的两个问题核心原因如下:
- 路径存储逻辑错误:
Path属于引用类型,你直接将全局的mPath添加到图层列表后立即调用reset(),列表中存储的是mPath的内存引用,因此reset()会同时清空列表中已经保存的路径,导致重绘时无路径可画,线条直接消失。 - 实时轨迹未绘制:
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
相关产品推荐
相关产品推荐

