我是Android画布的新手,我无法解决我的问题, 问题是: 我在两种模式中使用canvasXreXfermode.Mode.TARGET(用于删除单一颜色的出现)和PorterDuff.Mode.CLEAR(用于擦除画布的一部分)。
一切都是独立完美的 但在我的代码中,我想以这样的方式使用它们,当我选择我想要擦除特定的颜色时,它应该擦除它,我的代码就这样做了,但在我将模式切换到橡皮擦模式后删除该特定颜色后...使用AvoidXfermode删除的所有内容都会返回。
我在位图上做这些事情, 我的onDraw方法是:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(DrawBitmap, 0, 0, DrawBitmapPaint);
if (flag != 1) {
setDrawingCacheEnabled(true);
for (Path p : paths) {
canvas.drawPath(p, mPaint);
Bitmap bitmap = getDrawingCache();
DrawBitmap = bitmap;
//
}
//canvas.setBitmap(bitmap.isMutable() ? bitmap : bitmap.copy(Bitmap.Config.ARGB_8888,true));
} else if (flag == 1) {
if (touchx > mCanvas.getWidth() || touchy > mCanvas.getHeight() || touchx < 0 || touchy < 0) {
return;
}
for (Path p : paths) {
color = DrawBitmap.getPixel(touchx, touchy);
mPaint.setXfermode(new AvoidXfermode(color, 100, AvoidXfermode.Mode.TARGET));
mPaint.setColor(Color.TRANSPARENT);
canvas.drawPaint(mPaint);
setDrawingCacheEnabled(true);
Bitmap bitmap = getDrawingCache();
DrawBitmap = bitmap;
}
}
}
现在只是针对这个问题在onDraw中声明了所有内容, 以及我切换模式的代码是:
case R.id.erase:
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mPaint.setColor(Color.TRANSPARENT);
mPaint.setStrokeWidth(40);
flag = 0;
break;
case R.id.DELETE:
flag = 1;
break;
我创建画布的代码是:
DrawBitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sample);
DrawBitmap = DrawBitmap.copy(Bitmap.Config.ARGB_8888, true);
mCanvas = new Canvas(DrawBitmap);
mPath = new Path();
paths.add(mPath);
DrawBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
我错了,但我不知道在哪里,任何建议都会有所帮助,提前谢谢。
答案 0 :(得分:0)
Bitmap bitmap = getDrawingCache();
DrawBitmap = bitmap;
你的逻辑很复杂。我特指的是上面的代码行。您使用mCanvas
位图备份了DrawBitmap
。然后,您拥有canvas
onDraw()
,它由自己的位图支持。你需要理解的是你在DrawBitmap
逗留的任何东西,或者你称之为&#34;已经保存的#34;。通过canvas
绘制的任何内容在下次调用onDraw()
时都会发生变化。
因此,如果您想在DrawBitmap
中保存某些内容,请使用mCanvas
。您想要保存用户绘图状态的那一刻,请在mCanvas
中绘制它。您可以在mCanvas
上绘制所有内容,在onDraw()
结束时,您可以调用canvas.drawBitmap(DrawBitmap, 0, 0, DrawBitmapPaint);
这样,用户完成的所有操作都会保存在每一步中。