6

私はデフォルトのSurfaceView実装を使用しています。コードはここにあります(これは指の描画アプリの例です。無効にして画像を描画しました)。3つの主要な個別のクラスがあります -

  1. アクティビティ クラス ( SurfaceViewSampleActivity )
  2. SurfaceView (キャンバスビュー)
  3. スレッド クラス ( UIThread )。

SurfaceView は、コンストラクターで設定されたイメージ (ビットマップ) を描画します。また、ユーザーがカメラ アプリを呼び出して写真を撮ることができる機能も実装しました。画像はデフォルトの画像を交換する必要があります (SurfaceView コンストラクター セット画像上)。

アクティビティ クラスで簡単なメソッドを作成してビットマップを設定しようとしましたが、うまくいきませんでした:

private void setImage() {
    view.bitmap = this.mImageBitmap; 

}

SurfaceView スレッドがビットマップを使用している可能性があると考えたので、変数をロックしようとしました。

private void setImage() {   
    synchronized (view.bitmap) {
        view.bitmap = this.mImageBitmap;
    }   
}

アプリも落ちる。

SurfaceView 描画方法:

protected void onDraw(Canvas canvas) {
    setPaintProperties();

    if (canvas != null) {
        canvas.drawColor(Color.WHITE);

        synchronized ( this.bitmap ) {
            canvas.drawBitmap(this.bitmap, 0, 0, new Paint() );
        }

    }
}

コンストラクターが呼び出された後に、 SurfaceView のビットマップ変数を変更する方法はありますか?

4

1 に答える 1

1

あなたの実行方法はどのように見えますか。月着陸船のサンプルを見てみましょう。キャンバスをロックおよびロック解除する必要があります。

    @Override
    public void run() {
        while (mRun) {
            Canvas c = null;
            try {
                c = mSurfaceHolder.lockCanvas(null);
                synchronized (mSurfaceHolder) {
                    if (mMode == STATE_RUNNING) updatePhysics();
                    doDraw(c);
                }
            } finally {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
于 2013-01-25T19:22:12.750 に答える