撤消/重做在 android Canvas 中不起作用
Posted
技术标签:
【中文标题】撤消/重做在 android Canvas 中不起作用【英文标题】:Undo/Redo not working in android Canvas 【发布时间】:2016-09-19 11:01:51 【问题描述】:撤消和重做功能不适用于以下代码。下面是我的绘图代码实现。
下面的代码有问题吗?
公共类 DrawingArea 扩展视图 私有路径drawPath; 私有Paint drawPaint、canvasPaint; 私有intpaintColor = 0xFF660000; 私人画布drawCanvas; 私有位图画布位图; 私有 ArrayList 路径 = new ArrayList(); 私有 ArrayList undoPaths = new ArrayList(); 私人浮动 mX, mY; 私有静态最终浮点 TOUCH_TOLERANCE = 4; // 撤消、重做 私人 int 历史指针 = 0; 私有布尔擦除 = 假; 公共绘图区(上下文上下文) 超级(上下文); 设置绘图(); 公共绘图区(上下文上下文,AttributeSet attrs) 超级(上下文,属性); 设置绘图(); 公共无效 setupDrawing() 绘制路径 = 新路径(); drawPaint = new Paint(); drawPaint.setAntiAlias(true); drawPaint.setStrokeWidth(20); drawPaint.setStyle(Paint.Style.STROKE); drawPaint.setStrokeJoin(Paint.Join.ROUND); drawPaint.setStrokeCap(Paint.Cap.ROUND); canvasPaint = new Paint(Paint.DITHER_FLAG); //paths.add(drawPath); 公共无效setColor(字符串新颜色) 无效(); paintColor = Color.parseColor(newColor); drawPaint.setColor(paintColor); @覆盖 受保护的无效onDraw(帆布画布) 超级.onDraw(画布); canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); canvas.drawPath(drawPath, drawPaint); @覆盖 受保护的无效onSizeChanged(int w,int h,int oldw,int oldh) super.onSizeChanged(w, h, oldw, oldh); canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); drawCanvas = new Canvas(canvasBitmap); @覆盖 公共布尔 onTouchEvent(MotionEvent 事件) 浮动 x = event.getX(); 浮动 y = event.getY(); 开关 (event.getAction()) 案例 MotionEvent.ACTION_DOWN: touch_start(x, y); 无效(); 休息; 案例 MotionEvent.ACTION_MOVE: 触摸移动(x,y); 无效(); 休息; 案例 MotionEvent.ACTION_UP: 润色(); 无效(); 休息; 返回真; 私人无效触摸开始(浮动x,浮动y) drawPath.reset(); drawPath.moveTo(x, y); mX = x; 米 = y; 私人无效触摸移动(浮动x,浮动y) 浮动 dx = Math.abs(x - mX); 浮动 dy = Math.abs(y - mY); 如果(dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) drawPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); mX = x; 米 = y; 私人无效touch_up() drawPath.lineTo(mX, mY); // 提交到我们屏幕外的路径 drawCanvas.drawPath(drawPath, drawPaint); // 杀死它,这样我们就不会重复绘制 绘制路径 = 新路径(); 路径.add(drawPath); 公共无效 setErase() canvasBitmap.eraseColor(Color.TRANSPARENT); drawPath.reset(); 无效(); 公共无效 startNew() drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 无效(); 公共无效撤消() 如果 (paths.size() > 0) undoPaths.add(paths.remove(paths.size() - 1)); 无效(); 公共无效重做() if (undonePaths.size() > 0) 路径.add(undoPaths.remove(undoPaths.size() - 1)); 无效();【问题讨论】:
【参考方案1】:像这样改变你的 OnDraw()
protected void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.drawBitmap(mBitmap, 0, 0, canvasPaint);
canvas.drawPath(mPath,drawPaint);
for (Path p : paths)
canvas.drawPath(p, drawPaint);
并且不要忘记添加由 paths arraylist
保存的数据类型ArrayList<Path> paths = new ArrayList<Path>();
【讨论】:
但没有绘制位图。路径被绘制到位图上,因此任何“撤消”都不会影响底层位图。以上是关于撤消/重做在 android Canvas 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何撤消 HTML5 Canvas 绘图应用程序的橡皮擦操作
在 CoreData 应用程序上摇动撤消工作,但没有显示撤消/重做提示