Canvas#drawBitmap阻止了SurfaceView中的Canvas#drawPath

时间:2012-06-20 13:33:02

标签: android path bitmap draw surfaceview

我有SurfaceView必须在两个位图之间或之上绘制一条路径。我正在制作路径的绘图,使其看起来会变得完整。此代码可以提供我不会绘制位图。

指定位图(在onLayout(...)中,以获取View尺寸),如下所示:

mFrontBitmap = Bitmap.createBitmap((int) width, (int) height, mConfig);
Canvas temp = new Canvas(mFrontBitmap);
temp.drawColor(Color.TRANSPARENT, Mode.CLEAR);

(我正在擦拭它们以免遗漏任何东西。)然后SurfaceView线程的run方法中的绘制代码是

if(mCurrentLayer==Layer.BACK) {
    //draw path
    if(mPath!=null)
    canvas.drawPath(mPath, mPaint);
}

canvas.drawBitmap(mBackBitmap, 0, 0, null);

if(mCurrentLayer==Layer.MIDDLE) {
    //draw path
    if(mPath!=null)
        canvas.drawPath(mPath, mPaint);
}

canvas.drawBitmap(mFrontBitmap, 0, 0, null);

if(mCurrentLayer==Layer.FRONT) {
    //draw path
    if(mPath!=null)
        canvas.drawPath(mPath, mPaint);
}

将两条drawBitmap行注释掉后,动画渲染效果很好。有了它们,在动画完成之前我什么都看不见,然后将路径(完整地)渲染到其中一个位图。我有些不知所措。我查看了LunarLander示例并且它正在渲染背景位图,所以这显然是SurfaceView 可以做的事情,但对我来说它不会。它可能是什么?

1 个答案:

答案 0 :(得分:-1)

要在每次想要位图内容时绘制,每次执行canvas.drawPath(...)时都可以使用它:

mpath.invalidate();

(我假设mpath是view / surfaceview)。

所以它看起来像这样:

if(mCurrentLayer==Layer.BACK) {
    //draw path
    if(mPath!=null) {
        canvas.drawPath(mPath, mPaint);
        mPath.invalidate();
    }
}

canvas.drawBitmap(mBackBitmap, 0, 0, null);

if(mCurrentLayer==Layer.MIDDLE) {
    //draw path
    if(mPath!=null) {
        canvas.drawPath(mPath, mPaint);
        mPath.invalidate();
    }
}

canvas.drawBitmap(mFrontBitmap, 0, 0, null);

if(mCurrentLayer==Layer.FRONT) {
    //draw path
    if(mPath!=null) {
        canvas.drawPath(mPath, mPaint);
        mPath.invalidate();
    }
}