1

我有一个SurfaceView必须在两个位图下方、之间或上方绘制路径。我正在为路径的绘制设置动画,使其看起来会增长到全尺寸。如果我不绘制位图,则代码有效。

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

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

(我正在擦拭它们,以免留下任何机会。)然后SurfaceView线程运行方法中的绘制代码是

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 可以做的,但对我来说不会。会是什么呢?

4

1 回答 1

-1

要在每次需要位图内容时绘制,您可以在每次执行 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();
    }
}
于 2012-06-20T14:05:55.317 回答