0

なぜこれが機能しないのか、私は正直に困惑しています。onDraw 関数をオーバーライドするのではなく、レイアウト内の SurfaceView と描画するスレッドを使用して、単純な PNG を画面に描画しようとしています。これは基本的に、LunarLander サンプル プロジェクトとまったく同じ実装です (実際、コードセット全体をフラストレーションでリッピングしました)。

ログでテストしましたが、スプライトがキャンバスに「描画」されていることはわかっていますが、ウィンドウには何も表示されていません。

コードは次のとおりです。長すぎないことを願っています (重要でないビットは削除されています)。

activity_pannenkoekenhuis.xml (レイアウト/)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.example.pannenkoekenhuis.MainView
    android:id="@+id/pannenkoekenhuis_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Pannenkoekenhuis" >
</RelativeLayout>

</FrameLayout>

メインビュー (SurfaceView):

public class MainView extends SurfaceView implements SurfaceHolder.Callback {

class MainThread extends Thread {
    SurfaceHolder surfaceHolder;
    Context context;
    Handler handler;

    HandleResources hResources;
    HandleGame hGame;

    public MainThread(SurfaceHolder surfaceHolder, Context context,
            Handler handler) {
        this.surfaceHolder = surfaceHolder;
        this.context = context;
        this.handler = handler;
        hResources = new HandleResources(context);
        hGame = new HandleGame();

        init();
    }

    @Override
    public void run() {
        while (true) {
            Canvas canvas = null;
            try {
                canvas = surfaceHolder.lockCanvas(null);
                synchronized (surfaceHolder) {
                                            Drawable d = context.getResources().getDrawable(R.drawable.s_char);
                    d.draw(canvas);
                }
            } finally {
                if (canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}

MainThread thread;

public MainView(Context context, AttributeSet attrs) {
    super(context, attrs);

    SurfaceHolder surfaceHolder = getHolder();
    getHolder().addCallback(this);

    thread = new MainThread(surfaceHolder, context, new Handler());

    setFocusable(true);
}
}

前もって感謝します。

4

1 に答える 1

1

ガッ、分かった。おそらくグラフィックスの上に描画されていたため、何らかの理由で setBackgroundColor() を削除する必要がありました。愚かな間違い。

于 2012-10-19T21:12:48.640 に答える