1

SurfaceView2 つのビットマップの下、間、または上にパスを描画する必要があります。パスの描画をアニメートして、フル サイズに拡大するように表示します。このコードは、ビットマップを描画しない限り機能します。

ビットマップは次のように指定されます (寸法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);
}

2drawBitmap行をコメントアウトすると、アニメーションは正常にレンダリングされます。それらを入れると、アニメーションが完了するまで何も表示されず、パスが (全体として) ビットマップの 1 つに直接レンダリングされます。私は途方に暮れています。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 に答える