Canvas#drawBitmap 正在阻止 SurfaceView 中的 Canvas#drawPath



我有一个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可以做的事情,但对我来说它不会。 会是什么?

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

mpath.invalidate();

(我假设 mpath 是视图/表面视图)。

所以它看起来像这样:

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();
    }
}

最新更新