典型的な Android グラフィックス フローに従うのに少し問題があります。多くの例がありますが、私のものはうまくいかないようです。私の主な活動では、これを行います:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
私のリソース ファイルには、SurfaceView をオーバーライドする 3 つのカスタム クラスがあります。これらのサーフェス ビューのコンストラクターには、次のようなものがあります。
super(context, attrs);
getHolder().addCallback(this);
this.thread = new MyThread(getHolder(),this);
私のスレッドの run メソッドでは、これを行います (私が見た多くの例から取り上げました):
Canvas c;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
panel.onDraw(c);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
このスレッドは、SurfaceView の「surfaceCreated」イベントで開始されます。onDraw では、次のようにします。
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
<some drawing stuff here using canvas>
}
実行すると、スレッドは実際に実行され、onDraw が呼び出されていることがわかります (log print コマンドをそこに入れました) が、グラフィックが期待どおりに更新されません。ただし、 this.invalidate() を呼び出すと、これでクラッシュするまで、予想どおりグラフィックが数回更新されます。
E/AndroidRuntime(748): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
私が見た例によれば、OnDraw で invalidate を呼び出す必要はないことを認識していますが、onDraw のコードが有効であることを確認するためだけに呼び出しました。したがって、invalidate() がないと onDraw イベントが呼び出され、私のコードはグラフィックを適切に更新する必要があるように思えますが、画面は更新されません。メインのアクティビティが実際に子供を再描画する必要があると判断する方法に欠けています。
どんなアイデアでも大歓迎です。いくつかの動作中のデモからコピーしようとしてしばらく時間を費やしましたが、行き詰まっているようです。ありがとう