9

SurfaceView、SurfaceHolder、Callback セットアップを使用した描画を含むかなり標準的なアプリを Android SDK で実装しています。

私のメイン スレッド (UI スレッド) では、SurfaceHolder (またはそれで取得したキャンバス) の描画や処理はありません。

別のスレッドで、私は以下を持っています:

Log.i("GAME.DrawThread", "run()");
        Log.i("GAME.DrawThread", Thread.currentThread().getName());
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            synchronized(holder) {
                Log.i("GAME", "draw():synchronized");
                Paint paint = new Paint();
                paint.setColor(R.color.draw_color);
                canvas.drawColor(R.color.draw_color);
                canvas.drawLine(0, 0, 500, 500, paint);
            }
        } catch (SurfaceHolder.BadSurfaceTypeException e) {
            Log.e("GAME", "onDraw():  BadSurfaceTypeException");
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        } 

このコードは実行されており、例外はスローされず、私が見つけた負の副作用もありません。ただし、unlockCanvasAndPost() 呼び出しによって onDraw() が呼び出されることはありません。

つまり、unlockCanvasAndPost() は SurfaceView の再描画を引き起こしません。

この症状の原因は何ですか?私はJavaの経験が豊富で、Androidの経験もかなりあり、デバッグの経験も豊富で、これを追跡することはできません.

前もって感謝します。

4

4 に答える 4

12

したがって、SurfaceView を使用すると、ウィンドウの下にあるサーフェスに描画されることがわかります。ビューの背景色をxmlで設定していました。サーフェスではなく、ウィンドウの背景色を設定することがわかりました。実際には、下の Surface が見えないように Window を不透明にしました。

学んだ教訓。

于 2010-10-05T20:28:11.500 に答える
0

これは、SurfaceViewの動作方法ではありません。UnlockCanvasAndPost()を呼び出しても、onDraw()は呼び出されません。これが、SurfaceViewを使用する上でのポイントです。SurfaceViewのサーフェスは別のウィンドウにあります。

于 2010-09-29T05:27:22.347 に答える
0

これは古いですが、問題はサーフェスホルダー コールバックがないことだと感じています。彼はサーフェスが作成される前にサーフェスに描画しようとしていました

于 2011-03-20T18:35:07.300 に答える