【问题标题】:Undo/Redo not working in android Canvas撤消/重做在 android Canvas 中不起作用
【发布时间】:2016-09-19 11:01:51
【问题描述】:

撤消和重做功能不适用于以下代码。下面是我的绘图代码实现。

下面的代码有问题吗?

公共类 DrawingArea 扩展视图 { 私有路径drawPath; 私有Paint drawPaint、canvasPaint; 私有intpaintColor = 0xFF660000; 私人画布drawCanvas; 私有位图画布位图; 私有 ArrayList 路径 = new ArrayList(); 私有 ArrayList undoPaths = new ArrayList(); 私人浮动 mX, mY; 私有静态最终浮点 TOUCH_TOLERANCE = 4; // 撤消、重做 私人 int 历史指针 = 0; 私有布尔擦除 = 假; 公共绘图区(上下文上下文){ 超级(上下文); 设置绘图(); } 公共绘图区(上下文上下文,AttributeSet attrs){ 超级(上下文,属性); 设置绘图(); } 公共无效 setupDrawing() { 绘制路径 = 新路径(); drawPaint = new Paint(); drawPaint.setAntiAlias(true); drawPaint.setStrokeWidth(20); drawPaint.setStyle(Paint.Style.STROKE); drawPaint.setStrokeJoin(Paint.Join.ROUND); drawPaint.setStrokeCap(Paint.Cap.ROUND); canvasPaint = new Paint(Paint.DITHER_FLAG); //paths.add(drawPath); } 公共无效setColor(字符串新颜色){ 无效(); paintColor = Color.parseColor(newColor); drawPaint.setColor(paintColor); } @覆盖 受保护的无效onDraw(帆布画布){ 超级.onDraw(画布); canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); canvas.drawPath(drawPath, drawPaint); } @覆盖 受保护的无效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); } @覆盖 公共布尔 onTouchEvent(MotionEvent 事件){ 浮动 x = event.getX(); 浮动 y = event.getY(); 开关 (event.getAction()) { 案例 MotionEvent.ACTION_DOWN: touch_start(x, y); 无效(); 休息; 案例 MotionEvent.ACTION_MOVE: 触摸移动(x,y); 无效(); 休息; 案例 MotionEvent.ACTION_UP: 润色(); 无效(); 休息; } 返回真; } 私人无效触摸开始(浮动x,浮动y){ drawPath.reset(); drawPath.moveTo(x, y); mX = x; 米 = y; } 私人无效触摸移动(浮动x,浮动y){ 浮动 dx = Math.abs(x - mX); 浮动 dy = Math.abs(y - mY); 如果(dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE){ drawPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); mX = x; 米 = y; } } 私人无效touch_up(){ drawPath.lineTo(mX, mY); // 提交到我们屏幕外的路径 drawCanvas.drawPath(drawPath, drawPaint); // 杀死它,这样我们就不会重复绘制 绘制路径 = 新路径(); 路径.add(drawPath); } 公共无效 setErase() { canvasBitmap.eraseColor(Color.TRANSPARENT); drawPath.reset(); 无效(); } 公共无效 startNew() { drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 无效(); } 公共无效撤消(){ 如果 (paths.size() > 0) { undoPaths.add(paths.remove(paths.size() - 1)); 无效(); } } 公共无效重做(){ if (undonePaths.size() > 0) { 路径.add(undoPaths.remove(undoPaths.size() - 1)); 无效(); } } }

【问题讨论】:

    标签: android drawing android-canvas


    【解决方案1】:

    像这样改变你的 OnDraw()

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(mBitmap, 0, 0, canvasPaint);
        canvas.drawPath(mPath,drawPaint);
    
        for (Path p : paths) {
            canvas.drawPath(p, drawPaint);
        }
    
    
    
    }
    

    并且不要忘记添加由 paths arraylist

    保存的数据类型
    ArrayList<Path> paths = new ArrayList<Path>();
    

    【讨论】:

    • 但没有绘制位图。路径被绘制到位图上,因此任何“撤消”都不会影响底层位图。
    猜你喜欢
    • 2012-06-22
    • 2011-09-18
    • 1970-01-01
    • 2014-05-26
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多