如何擦除画布上绘制的线条?

And*_*Dev 2 android canvas draw erase

我正在使用一个Canvas类在画布上绘制线条.现在我想用与使用橡皮擦的笔记本中类似的方式擦除画布中绘制的线条.我通过几个例子,但没有什么对我有用.

如果有人知道这个问题的解决方案,请你帮我解决这个问题.

Java代码

public class DrawView extends View implements OnTouchListener 
{
        private Canvas      m_Canvas;

        private Path        m_Path;

        private Paint       m_Paint;

        ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>();

        ArrayList<Pair<Path, Paint>> undonePaths = new ArrayList<Pair<Path, Paint>>(); 

        private float mX, mY;

        private static final float TOUCH_TOLERANCE = 4;

        private Bitmap          bitmapToCanvas;

        private CanvasManager   m_CanvasManagerObject;

        private Paint   mBitmapPaint;

        public DrawView(Context context)
        {
            super(context);
            setFocusable(true);
            setFocusableInTouchMode(true);      
            this.setOnTouchListener(this);

            onCanvasInitialization();
        }    

        public void onCanvasInitialization()
        {
            m_Paint = new Paint(Paint.DITHER_FLAG);
            m_Paint.setAntiAlias(true);
            m_Paint.setDither(true);
            m_Paint.setColor(Color.parseColor("#37A1D1"));
            m_Paint.setStyle(Paint.Style.STROKE);
            m_Paint.setStrokeJoin(Paint.Join.ROUND);
            m_Paint.setStrokeCap(Paint.Cap.ROUND);
            m_Paint.setStrokeWidth(2);                          
            m_Path = new Path();

            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) 
        {       
            super.onSizeChanged(w, h, oldw, oldh);

            bitmapToCanvas = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            m_Canvas = new Canvas(bitmapToCanvas);
        }

        @Override
        protected void onDraw(Canvas canvas)
        {           
            canvas.drawBitmap(bitmapToCanvas, 0f, 0f, mBitmapPaint);    
            canvas.drawPath(m_Path, m_Paint);
        }

        public boolean onTouch(View arg0, MotionEvent event) 
        {
            float x = event.getX();
            float y = event.getY();

            switch (event.getAction()) 
            {
                case MotionEvent.ACTION_DOWN:
                touch_start(x, y);
                invalidate();
                break;
                case MotionEvent.ACTION_MOVE:
                touch_move(x, y);
                invalidate();
                break;
                case MotionEvent.ACTION_UP:
                touch_up();
                invalidate();
                break;
            }

            return true;
        }

        private void touch_start(float x, float y) 
        {
            m_Path.reset();
            m_Path.moveTo(x, y);
            mX = x;
            mY = y;
        }

        private void touch_move(float x, float y) 
        {
            float dx = Math.abs(x - mX);
            float dy = Math.abs(y - mY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) 
            {
                m_Path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
                mX = x;
                mY = y;
            }
        }

        private void touch_up() 
        {
            m_Path.lineTo(mX, mY);

            // commit the path to our offscreen
            m_Canvas.drawPath(m_Path, m_Paint);

            // kill this so we don't double draw                    
            Paint newPaint = new Paint(m_Paint); // Clones the mPaint object
            paths.add(new Pair<Path, Paint>(m_Path, newPaint));
            m_Path = new Path();
        }

        public void onClickEraser() 
        { 

        }

}
Run Code Online (Sandbox Code Playgroud)

小智 6

如果你有纯色背景,你需要做的就是将Paint颜色设置为你的背景颜色.例如,如果您有白色背景,则可以执行以下操作:

paint.setColor(Color.White);
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要擦除具有透明背景的线条,请尝试以下操作:

要使用透明颜色进行绘制,必须使用Paint setXfermode该颜色,只有在将位图设置到画布时才能使用.如果您按照以下步骤操作,则应获得所需的结果.

  1. 创建画布并设置其位图.

    mCanvas = new Canvas();
    mBitmap= Bitmap.createBitmap(scrw, scrh, Config.ARGB_8888);
    mCanvas.setBitmap(mBitmap);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当你想要删除某些东西时,你只需要使用setXfermode.

    public void onClickEraser() 
    { 
       if (isEraserOn)
          mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
       else
          mPaint.setXfermode(null);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在你应该可以使用透明颜色绘制:

    mCanvas.drawPath(path, mPaint);