我可以只使用一个位图绘制alpha吗?

时间:2014-11-25 04:50:17

标签: android android-canvas

我在画布上绘制了以下代码。该代码来自SO和Android SDK演示,我已经将其删除以更好地解释我的问题。代码本质上是有效的,但它会使alpha图形的旧部分随着时间的推移变得更暗,因为它在onDraw()中反复绘制位图(这在使用SDK中演示的实线时不是问题,但是变成了使用alpha时的一个。)

Drawing

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线条或在每个路径后重新绘制所有内容?我正在寻找一种廉价的解决方案。

这里的问题是位图和画布是直接耦合的,所以当我在画布上绘制时,结果立即反映在位图中。所以我不能清除其中一个?

2 个答案:

答案 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);