オンライン チュートリアルや 2D ゲームの Android SDK サンプルでは、通常、ゲーム スレッドの run() メソッド内に描画関数があり、キャンバス上での描画を担当します。たとえば、古典的な月着陸船のコードでは、 class に次のコードがありますLunarThread
。
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING) updatePhysics();
doDraw(c);
}
} finally {
// ...
}
}
}
private void doDraw(Canvas canvas) {
canvas.drawBitmap(mBackgroundImage, 0, 0, null);
// ...
}
ただし、Android 開発ガイドには、次のように明確に記載されています。
UI スレッドの外部から Android UI ツールキットにアクセスしないでください。
2 つの質問があります。
- 「 Android UIツールキット」の意味に戸惑います。キャンバスは SurfaceHolder によってロックされており、SurfaceHolder はユーザー入力 (タッチ イベントなど) を受け入れることができるサーフェスを保持しているため、キャンバスは「Android UI ツールキット」と見なされますか?
- それらのチュートリアルまたはコード サンプルは上記のルールに違反していますか? もしそうなら、なぜそのような違反が容認されるのですか? そうでない場合、なぜですか?