橡皮擦不工作透明画布视图android

时间:2016-10-25 04:21:32

标签: android android-canvas

我使画布视图透明,代码如下;

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.OVERLAY);
}

以下代码用于橡皮擦及其无法正常工作

if (this.mode == Mode.ERASER) {
// Eraser
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
paint.setARGB(0, 255, 0, 0);
paint.setColor(eraserColor); 
paint.setStrokeWidth(DrawingActivity.eraserSize);
 }

1 个答案:

答案 0 :(得分:0)

这里是完整的代码。试试吧。

public class TryDraw extends View {

    private  Path drawPath;
    private  Paint drawPaint;
    private Paint canvasPaint;
    private Canvas drawCanvas;
    public static Bitmap canvasBitmap;
    private boolean erase=false;
    float touchX;
    float touchY;
    float strokeWidth;

    public TryDraw(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setupDrawing(){

        strokeWidth=getResources().getDimension(R.dimen.medium_brush);
        drawPath = new CustomPath();
        drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DITHER_FLAG);
        drawPaint.setColor(Color.RED);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(strokeWidth);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);

    }
    @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);
        drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.OVERLAY);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(canvasBitmap,0,0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(event.getX(),event.getY());
                touchX = event.getX();
                touchY = event.getY();
                drawPath.lineTo(touchX,touchY);

                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(event.getX(), event.getY());
                touchX = event.getX();
                touchY = event.getY();

                break;
            case MotionEvent.ACTION_UP:
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath=new Path();
                break;
            default:
                return false;
        }
        invalidate();
        return true;

    }

    public void setColor(int newColor){
        invalidate();
        drawPaint.setColor(newColor);
    }

    public void setErase(boolean isErase){
        if(!isErase) {
            drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
            drawPaint.setStrokeWidth(45.0f);
            erase=true;
        }else {
            drawPaint.setXfermode(null);
            drawPaint.setStrokeWidth(strokeWidth);
            erase=false;
        }
    }

    public void startNew(){
        mDrawingList.clear();
        drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        invalidate();
    }

}