2014-04-12 234 views
0

我正在为android用户绘制应用程序。我想在我的应用程序上实现撤消重做功能。我指的是发布在stackoverflow上的问题来解决我的问题,但我无法找到适合我的代码的解决方案。下面我张贴我的代码,请帮我摆脱这个问题。任何帮助将不胜感激。撤消重做功能不起作用。

预先感谢您。

public class DrawingView extends View { 

private ArrayList<Path> paths = new ArrayList<Path>(); 
private ArrayList<Path> undonePaths = new ArrayList<Path>(); 

public DrawingView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
    this.context = context; 
    setupDrawing(); 
} 

public void setupDrawing(){ 

    drawPath = new Path(); 
    drawPaint = new Paint(); 

    canvasPaint = new Paint(Paint.DITHER_FLAG); 

    brushSize = getResources().getInteger(R.integer.medium_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); 

    paths.add(drawPath); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
//view given size 
    super.onSizeChanged(w, h, oldw, oldh); 

    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    drawCanvas = new Canvas(canvasBitmap); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    //draw view 
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
    canvas.drawPath(drawPath, drawPaint); 
    for(Path p : paths){ 
     canvas.drawPath(p, drawPaint); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    float touchX = event.getX(); 
    float touchY = event.getY(); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
    // undonePaths.clear(); 
     drawPath.moveTo(touchX, touchY); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     drawPath.lineTo(touchX, touchY); 
     break; 
    case MotionEvent.ACTION_UP: 
    // drawPath.lineTo(touchX, touchY); 
     drawCanvas.drawPath(drawPath, drawPaint); 
     drawPath.reset(); 
     drawPath = new Path(); 
     paths.add(drawPath); 
     break; 
    default: 
     return false; 
    } 
    invalidate(); 
    return true; 
} 


public void onClickUndo(){ 
    if(paths.size()>0){ 
     undonePaths.add(paths.remove(paths.size() - 1)); 
     Toast.makeText(getContext(), "Undo is working", Toast.LENGTH_LONG).show(); 
     invalidate(); 
    } 
    else{ 
     Toast.makeText(getContext(), "Undo is not working", Toast.LENGTH_LONG).show(); 
    } 
} 

public void onClickRedo(){ 
    if(undonePaths.size()>0){ 
     paths.add(undonePaths.remove(undonePaths.size() - 1)); 
     Toast.makeText(getContext(), "Redo is working", Toast.LENGTH_LONG).show(); 
     invalidate(); 
    } 
    else{ 
     Toast.makeText(getContext(), "Redo is not working", Toast.LENGTH_LONG).show(); 
    } 
} 

} 
+0

单击撤消时发生了什么?它是否说“撤消不起作用”,或者你有一些不受欢迎的效果? – CodeCamper

回答

0

只是一些小的变化。

您的列表中还有一个额外的Path,导致撤消/重做步骤在其余部分得到纠正时基本无法执行任何操作。因此,在setupDrawing()删除:

paths.add(drawPath); 

onDraw()方法,删除:

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

drawBitmap()呼叫重画被吸引到每个ACTION_UP成员位图,使它看起来好像你Path名单没有被更新。

然后,在onTouchEvent()方法,MotionEvent.ACTION_DOWN取消注释:

undonePaths.clear(); 

,改变MotionEvent.ACTION_UP情况:

case MotionEvent.ACTION_UP: 
    drawCanvas.drawPath(drawPath, drawPaint); 
    paths.add(drawPath); 
    drawPath = new Path(); 
    break; 

reset()呼叫清除Path,你不要”不想要。相反,在这里我们将最近完成的Path添加到列表中,然后创建一个新的继续。

注意:这是目前的工作方式,撤销/重做功能不会影响canvasBitmap。由于目前还不清楚这个Bitmap是什么,所以我保持原样。如果您希望此位图镜像视图,您可以简单地将drawCanvas.drawPath()调用移动到onDraw(),并行调用canvas.drawPath()调用。

+0

您的代码无需使用canvasBitmap即可完美运行。但我需要使它与canvasBitmap一起工作。我指的是这个教程http://code.tutsplus.com/tutorials/android-sdk-create-a-drawing-app-touch-interaction--mobile-19202。请建议我使它与canvasBitmap一起工作。 – himanshu

+0

什么是'canvasBitmap'?即,它的功能是什么? –

+0

其模式填充位图,我可以选择并通过手指触摸绘制。 – himanshu

-1
var undoRedo = new Array(); 
var unStep = -1; 

function historySave() { 
    unStep++; 
    while (undoRedo.length > 20) { 
     undoRedo.shift(); 
     unStep--; 
    } 
    if (unStep !== 0 && unStep < undoRedo.length) { 
     undoRedo.length = unStep; 
     unStep++; 
    } else { 
     undoRedo.length = unStep; 
    } 
    undoRedo.push(document.getElementById('drawingCanvas').toDataURL());  
} 

function Undo() { 
    if (unStep > -1) { 
     unStep--; 
     var canvasPic = new Image(); 
     canvasPic.src = undoRedo[unStep]; 
     drawingContext.clearRect(0,0,drawingCanvas.width,drawingCanvas.height); 
     canvasPic.onload = function() { 
     drawingContext.drawImage(canvasPic, 0, 0); 
      } 
    } 
} 

function Redo() { 
    if (unStep < undoRedo.length - 1) { 
     unStep++; 
     var canvasPic = new Image(); 
     canvasPic.src = undoRedo[unStep]; 
     canvasPic.onload = function() { 
     drawingContext.drawImage(canvasPic, 0, 0); 
     } 
    } 
} 
+0

这是针对Android的,这就是问题所在? – Pang