在自定义工程视图中,撤消和重做选项不起作用

时间:2014-02-09 15:26:12

标签: android paint undo undo-redo redo

我正在尝试在自定义绘图视图应用中制作undoredo个选项。但它并没有像我想的那样工作。

我的英语不好。通过图片,让我试着展示undoredo函数的工作原理。希望如此,这张照片将解释我的问题。 enter image description here

我想在第一次撤消点击时删除第一行,在第二次撤消点击时依次删除第二行等等...同样在重做时点击第一次点击时绘制最后一行,第二次点击后点击第二行依此类推......

这是我的自定义视图类。

public class DrawingView extends View{

    ArrayList<Path> undoPath = new ArrayList<Path>();
    ArrayList<Path> paths    = new ArrayList<Path>();
    private static int pathSize =0;
    //draw path
    private Path drawPath;
    //drawing and canvas point
    private Paint drawPaint, canvasPaint;
    //initial color
    private int paintColor=0xFF660000;
    //canvas
    private Canvas drawCanvas;
    //canvas bitmap
    private Bitmap canvasBitmap;

    private float brushSize, lastBrushSize; 

    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDrawing();
    }
    public void setPattern(String newPattern){
        invalidate();
        int patternID = getResources().getIdentifier(newPattern, "drawable", "com.faisalahsan.paintingapp");
        Bitmap patternBMP = BitmapFactory.decodeResource(getResources(), patternID);
        BitmapShader patternBMPShader = new BitmapShader(patternBMP, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        drawPaint.setColor(0xFFFFFFFF);
        drawPaint.setShader(patternBMPShader);

    }
    private void setupDrawing(){
        //get drawing area setup for interaction
        drawPath = new Path();
        drawPaint= new Paint();

        paths.add(drawPath);

        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);

        canvasPaint = new Paint(Paint.DITHER_FLAG);     
    }

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

    @Override
    protected void 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);

    }

    public void onClickUndo () {
        if (paths.size()>0)  {
         undoPath.add(paths.remove(paths.size()-1));         
         invalidate();
        }          
       }

       public void onClickRedo (){
        if (undoPath.size()>0)  {
         paths.add(undoPath.remove(undoPath.size()-1));         
         invalidate();
         }
        }


    @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);            
            break;
        case  MotionEvent.ACTION_UP:
            drawCanvas.drawPath(drawPath, drawPaint);
            drawPath.reset();
            drawPath = new Path();
            paths.add(drawPath);
            break;
        default:
            return false;
        }
        invalidate();
        return true;        
    }   
}

1 个答案:

答案 0 :(得分:0)

当“撤消”从ArrayList“路径”中删除操作时,您不会在画布上“重绘” - 换句话说,将其从列表中取出不会更改图像。在绘制之前,您必须重绘画布上的内容以“撤消”操作。

在“onDraw”启动时保存画布的状态,然后在调用undo时重绘该画布。您需要保持同步的画布状态堆栈,以便执行一系列“撤消”和“重做”调用。