2014-04-12 3 views
0

나는 안드로이드 사용자를위한 그리기 응용 프로그램을 만들고 있습니다. 내 애플 리케이션에 다시 실행 취소 기능을 구현 싶어요. 내 문제를 해결하기 위해 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() 제거에 다음 onDraw() 방법에서

paths.add(drawPath); 

는 제거 :

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

drawBitmap() 전화가 당신의 Path 목록 것처럼 표시하고, 모든 ACTION_UP에 그려집니다 멤버 비트 맵을 다시 그릴했다 업데이트되지 않았습니다.

다음, onTouchEvent() 방법, MotionEvent.ACTION_DOWN 않은 코멘트에 :

undonePaths.clear(); 

과에 MotionEvent.ACTION_UP 경우 변경 :

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

당신이 '돈되는의 Path을 삭제 된 reset() 전화 싶어. 대신, 여기에 최근에 완료 한 Path을 목록에 추가 한 다음 계속하려면 새로 작성하십시오.

NB : 현재 작동하고있는 방식으로 실행 취소/다시 실행 기능이 canvasBitmap에 영향을 미치지 않습니다. 이 비트 맵이 무엇인지에 대해 명확하지 않으므로 그대로 두었습니다. 이 비트 맵에서보기를 미러링하려면 으로 drawCanvas.drawPath() 호출을 간단히 이동하여 canvas.drawPath() 호출로 이동할 수 있습니다.

+0

코드가 canvasBitmap없이 완벽하게 작동합니다. 하지만 canvas와 함께 작동시켜야합니다 .Bitmap. 이 자습서 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

안드로이드 용인가요? 질문에 대한 질문이 무엇입니까? – Pang

관련 문제