FingerPaint Erasing显示黑线

时间:2012-11-26 14:25:25

标签: java android graphics

早上好,

我的部分应用程序具有记录一些手写笔记的能力。我正在使用指纹示例中的碎片在我的应用程序中实现“橡皮擦”:

mPaint.setXfermode(new PorterDuffXfermode(
        PorterDuff.Mode.CLEAR));
mPaint.setStrokeWidth(45);
mPaint.setStrokeCap(Paint.Cap.ROUND);

问题是每当我擦除时,用户已经擦除了黑色路径。一旦用户拿起他们的手指就会消失,但是当他们正在擦除时它就在那里。我的朋友告诉我,PorterDuff模式不应该被实时使用,但我不相信他。这是我的一些代码,以防我做了一些愚蠢的事情:

mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(false);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.BUTT);
mPaint.setStrokeWidth(6);
mBitmap = Bitmap.createBitmap(800, 480,Bitmap.Config.ARGB_8888);
bBitmap = Bitmap.createBitmap(800, 480,Bitmap.Config.ARGB_8888);
bBitmap.eraseColor(Color.WHITE);
mCanvas = new Canvas(mBitmap);
mPath = new Path();
mBitmapPaint = new Paint();
maxX = maxY = 100;
minX = 750;
minY = 400;

//

private void touch_up() {
    mPath.lineTo(mX, mY);
    mCanvas.drawPath(mPath, mPaint);
    mPath.reset();
}

//

protected void onDraw(Canvas canvas) {    
    canvas.drawBitmap(bBitmap, 0, 0, null);
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, mPaint);
}

有可能做我想要这个橡皮擦做的事吗?有一个更好的方法吗?我的朋友真的对吗?

此外,我尝试将白色绘制为擦除,但它不起作用,因为有时用户正在标记下方的图像。我可以通过并使每个白色像素透明,但这似乎超级低效。

5 个答案:

答案 0 :(得分:4)

我找到了一种正确的方法,用手指擦除,没有黑色笔划。 这是我的解决方案:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        if(isEraseMode()){
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        }
        touch_start(x, y);
        invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        touch_move(x, y);
        if(isEraseMode()){
            mPath.lineTo(mX, mY);
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
            mPath.moveTo(x, y);            
                }
        invalidate();
        break;
    case MotionEvent.ACTION_UP:
        touch_up();
        invalidate();
        break;
    }
    return true;
}  

答案 1 :(得分:2)

好的,我找到了解决方案。我会把这个留给遇到类似问题的人:

case MotionEvent.ACTION_DOWN:
mPaint.setStrokeWidth(25);
            mPaint.setXfermode(new PorterDuffXfermode(
                    PorterDuff.Mode.CLEAR));
            mCanvas.drawCircle(x, y, 10, mPaint);
            isErase = true;
            invalidate();
        }
        touch_start(x, y);
        invalidate();
        break;
case MotionEvent.ACTION_MOVE:   
        if(isErase)
        {
            mCanvas.drawCircle(x, y, 20, mPaint);
        }
        else{
            touch_move(x, y);
        }invalidate();
        break;

答案 2 :(得分:2)

我有同样的问题。

最后,我找到了解决方案。 不要使用从onDraw()传递的画布,而是使用在构造函数中创建的mCanvas

答案 3 :(得分:1)

(解决方法)它会花费你的不确定性。 在初始化画布后,可能在您的活动的onCreate中。 myCanvasView.setAlpha(0.99f);

答案 4 :(得分:0)

我同意@Rovers,只需以这种方式更改canvas

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    if (!erase) {
        canvas.drawPath(drawPath, drawPaint);
    } else {
        drawCanvas.drawPath(drawPath, drawPaint);
    }
}

onDraw方法有两种画布 - > drawCanvascanvas