0

この質問は、Android の描画、消去、元に戻すアクションなど、何度も尋ねられていますが 、適切な解決策を提供している人はいません。私は描画アプリを作成していますが、元に戻す機能を追加するまではすべて正常に機能していました。元に戻す機能を追加した後、消しゴムが正常に機能しません。以前の描画を黒くし、同様に消去しません。これは私の DrawingView クラスのコンストラクターです。

public DrawingView(Context context){
    super(context);
    // if(!isInEditMode())
    setLayerType(View.LAYER_TYPE_SOFTWARE, drawPaint);

            drawPath = new Path();
    drawPaint = new Paint();
    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(35);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);
    canvasPaint = new Paint(Paint.DITHER_FLAG);

}

これがonDrawメソッドです

@Override
protected void onDraw(Canvas canvas) {
//draw view

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

     for (Path p : paths)
        {
           drawPaint.setColor(colorsMap.get(p));
           drawPaint.setStrokeWidth(widthMap.get(p));
           canvas.drawPath(p, drawPaint);          
        } 
        drawPaint.setColor(paintColor);
        drawPaint.setStrokeWidth(30);

    if(erase){
        return;
    }
    canvas.drawPath(drawPath, drawPaint);
}

ここに touchEvent Handler があります

@Override
public boolean onTouchEvent(MotionEvent event) {
//detect user touch     
    float touchX = event.getX();
    float touchY = event.getY();
    if(erase){
    //  drawPaint.setColor(paintColor);
        drawCanvas.drawPath(drawPath, drawPaint);
        invalidate();
    }

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
         undonePaths.clear();
           drawPath.reset();

        drawPath.moveTo(touchX, touchY);

        break;
    case MotionEvent.ACTION_MOVE:
         drawPath.lineTo(touchX, touchY);

        break;
    case MotionEvent.ACTION_UP:
        drawCanvas.drawPath(drawPath, drawPaint);
       if(!erase){
        paths.add(drawPath);
        colorsMap.put(drawPath,getDrawingColor());
        widthMap.put(drawPath,30);
       }
        drawPath = new Path();


        break;
    default:
        return false;
    }
    invalidate();
    return true;
}

ここに私の SetErase メソッドがあります

public void setErase(boolean isErase){
    //set erase true or false    
    erase=isErase;
    if(erase){
        drawPaint.setMaskFilter(null);
        drawPaint.setAlpha(0xFF);
        drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        } 
    else{ drawPaint.setXfermode(null);  
        }
    }

そして最後の元に戻すメソッド

public void onClickUndo() 
{ 
   if (paths.size()>0) 
    { 
       undonePaths.add(paths.remove(paths.size()-1));
       invalidate();
    }      
   else Toast.makeText(getContext(), "nothing more to undo", Toast.LENGTH_SHORT).show();
}

描画アプリで元に戻す機能と消去機能を一緒に実装する方法はありませんか? もし、そうなら?その後、いくつかの助けを提供してください。ありがとう

4

1 に答える 1