【问题标题】:In custom drawing views, undo and redo options is not working在自定义图纸视图中,撤消和重做选项不起作用
【发布时间】:2014-03-06 19:47:53
【问题描述】:

我正在尝试在自定义绘图视图应用程序中创建 undo,redo 选项。但它没有按我的意愿工作。

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

我想在第一次撤消单击时删除第一行,在第二次撤消单击时删除第二行,依此类推...类似地,在重做单击时,在第一次单击时绘制最后一行,在第二次单击时删除倒数第二行,依此类推..

这是我的自定义视图类。

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

【问题讨论】:

    标签: android paint undo undo-redo redo


    【解决方案1】:

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

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

    【讨论】:

    • 你能帮我举个例子或一段代码吗?
    • 阅读此内容:stackoverflow.com/questions/3973557/… 您缺少“堆栈”一侧(您正在跟踪“命令”而不是操作堆栈...您可能需要每个位图的缓存版本内存原因;所以 ArrayList bitmaps = new ArrayList(); 在每次更改之前存储它们图像的状态。但是您需要缓存的不仅仅是几个“撤消”选项。然后是“重做” " 你需要另一个像 ArrayList redoBitmaps
    猜你喜欢
    • 2021-11-12
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多