【问题标题】:Undo Button In Android Drawing AppAndroid绘图应用程序中的撤消按钮
【发布时间】:2013-11-19 15:30:18
【问题描述】:

所以我想为我正在为 android 开发的绘图应用程序实现一个撤消按钮。我目前的想法是将当前绘制路径放入 MotionEvent.ACTION_UP 上的路径列表中。在 onDraw() 中,只需绘制路径列表中的所有内容。当用户按下 undo 时,您从路径列表中删除最后绘制的路径并调用 invalidate(),强制调用 onDraw(),这将绘制路径列表中的所有内容。由于我们从列表中删除了先前的路径,因此不应绘制该路径,因此应该“撤消”。

我遇到的问题是路径似乎从未真正撤消。看来我脑子里的逻辑是正确的,但是这个实现不能正常工作。任何帮助将不胜感激。

这是我的代码:

DrawingView.java:

实例变量(阐明以下方法):

private Context context;
private Path drawPath;
private Paint drawPaint;
private Paint canvasPaint;
private Canvas drawCanvas;
private Bitmap canvasBitmap;
private int previousPaintColor;
private int paintColor;
private float brushSize;
private float eraserSize;
private float lastBrushSize;
private boolean isErasing = false;
private List<Path> moveList = null;
private List<Path> undoList = null;
private List<Path> currentMoveList = null;

从构造函数调用:

private void setupDrawing() {
    drawPath = new Path();
    drawPaint = new Paint();

    brushSize = getResources().getInteger(R.integer.default_brush_size);
    lastBrushSize = brushSize;

    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(brushSize);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);

    canvasPaint = new Paint(Paint.DITHER_FLAG);
}

onDraw:

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    for (Path path : currentMoveList) {
        canvas.drawPath(path, drawPaint);
    }
    for (Path path : moveList) {
        canvas.drawPath(path, drawPaint);   
    }
}

onTouchEvent:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            currentMoveList.add(drawPath);
            break;
        case MotionEvent.ACTION_UP:
            drawPath.lineTo(touchX, touchY);
            drawCanvas.drawPath(drawPath, drawPaint);
            moveList.add(drawPath);
            drawPath = new Path();
            currentMoveList.clear();
            break;
        default:
            return false;
    }
    invalidate();
    return true;
}

撤消():

public void undo() {
    if (moveList.size() > 0) {
        undoList.add(moveList.remove(moveList.size() - 1));
        invalidate();   
    }
}

问候,

凯尔。

【问题讨论】:

    标签: java android drawing android-canvas paint


    【解决方案1】:

    经过一些试验和错误,这里是修复:

    去掉这行代码:

    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    

    来自 onDraw() 方法,一切正常:)

    【讨论】:

      【解决方案2】:

      **撤消您的 onDraw 覆盖方法 ((TESTED)) **

      @Override
      protected void onDraw(Canvas canvas) {
          canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
          canvas.drawPath(drawPath, drawPaint);
          for (Path path : currentMoveList) {
              canvas.drawPath(path, drawPaint);
          }
          for (Path path : moveList) {
              canvas.drawPath(path, drawPaint);   
          }
          super.onDraw(canvas);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 2017-07-13
        • 2013-02-03
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        相关资源
        最近更新 更多