早上好,
我的应用程序的一部分具有写下一些手写笔记的功能。我正在使用手指绘画示例中的片段在我的应用程序中实现"橡皮擦":
mPaint.setXfermode(new PorterDuffXfermode(
PorterDuff.Mode.CLEAR));
mPaint.setStrokeWidth(45);
mPaint.setStrokeCap(Paint.Cap.ROUND);
问题是每当我擦除时,用户都会擦除一条黑色路径。一旦用户拿起手指,它就会消失,但在他们擦除时它就在那里。 我的朋友告诉我,波特达夫模式不应该实时使用,但我不相信他。 以下是我的更多代码,以防万一我做了一些愚蠢的事情:
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);
}
是否可以做我想让这个橡皮擦做的事情? 有没有更好的方法可以做到这一点? 我的朋友真的是对的吗?
我也尝试只涂成白色作为擦除,但它不起作用,因为有时下面有一个用户正在标记的图像。 我可以遍历并使每个白色像素透明,但这似乎效率极低。
我已经找到了一种方法来正确执行此操作,它用手指擦除,没有黑色笔划。这是我的解决方案:
@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;
}
好的,所以我想出了一个解决方案。 我将把这个留给遇到类似问题的人:
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;
我有同样的问题。
最后,我想出了解决方案。不要使用从onDraw()
传递的画布,而是使用在构造函数中创建的mCanvas
。
(解决方法)它会让你付出不透明。初始化画布后,也许在您的活动onCreate
。 myCanvasView.setAlpha(0.99f);
同意@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
方法有两种画布--> drawCanvas
和canvas
。