我在画布上绘制了以下代码。该代码来自SO和Android SDK演示,我已经将其删除以更好地解释我的问题。代码本质上是有效的,但它会使alpha图形的旧部分随着时间的推移变得更暗,因为它在onDraw()中反复绘制位图(这在使用SDK中演示的实线时不是问题,但是变成了使用alpha时的一个。)
public class CanvasView extends View {
public void init() {
bitmap = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888); // a bitmap is created
canvas = new Canvas(bitmap); // and a canvas is instantiated
}
// Events
@Override public boolean onTouchEvent(@Nonnull MotionEvent event) {
float x = event.getX(); float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // when the user touches down
path.reset(); // the previous path is reset (if any)
drawingTool.down(); // my own class which encapsulates path.moveTo()
break;
case MotionEvent.ACTION_MOVE: // when the user paints
Rect dirtyRect = drawingTool.move(x, y); // encapsulates path.quadTo() // the path is built
if (dirtyRect != null) { invalidate(dirtyRect); } // and the dirty rectangle is invalidated
break;
case MotionEvent.ACTION_UP: // when the user lifts the finger
canvas.drawPath(path, paint); // the final path is drawn
path.reset();
invalidate(); // and the full area invalidated (just to make sure the final drawing looks as it should)
break;
}
return true;
}
@Override protected void onDraw(@Nonnull Canvas canvas) { // after every move or up event
super.onDraw(canvas);
canvas.drawBitmap(bitmap, 0, 0, null); // the previous bitmap is drawn [here is the problem]
canvas.drawPath(path, paint); // and the new path is added
}
}
问题发生在onDraw()上,因为位图是反复绘制的。因此,每次完成新路径时,先前的绘图都会变暗。
我知道我可以采用第二个位图并在绘制每个路径后缓存结果,然后应用" clean"每个新路径的位图。但这将是昂贵的。
有没有办法在不使用第二个位图的情况下绘制alpha线条或在每个路径后重新绘制所有内容?我正在寻找一种廉价的解决方案。
这里的问题是位图和画布是直接耦合的,所以当我在画布上绘制时,结果立即反映在位图中。所以我不能清除其中一个?
答案 0 :(得分:1)
我玩了一段时间,我意识到解决方案就像在onDraw中切换两个命令一样简单。
而不是
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.drawPath(path, paint);
使用
canvas.drawPath(path, paint);
canvas.drawBitmap(bitmap, 0, 0, null);
最后绘制位图可以解决问题。在绘画时它仍然太暗,所以它需要更多的调整,但主要问题已经解决。
另外,关于它的好处是我不需要第二个位图。但很明显,第二个位图不太合理,因为我的位图已经缓存了图像,onDraw()只是将它绘制到视图中。
答案 1 :(得分:0)
实际上,您可以将Alpha级别设置为Paint对象。例如:
Paint transparentpaint = new Paint();
transparentpaint.setAlpha(100); // 0 - 255
canvas.drawBitmap(bitmap, 0, 0, transparentpaint);
尝试粘贴此代替canvas.drawBitmap(bitmap, 0, 0, null);