なぜこれが機能しないのか、私は正直に困惑しています。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);
}
}
前もって感謝します。