私はAndroid用のゲームに取り組んでいます。それを実装するのを助けるために、私の考えはビューのサブクラスを作成することです。次に、このクラスのいくつかのインスタンスをメインビューの子として挿入します。各インスタンスは、(OnTouchListenerを介して)押されたときの検出を処理します。
私が今抱えている問題は、これらすべてのサブビューをループして、それらのステータスを読み取って処理できるようにする方法です。 (つまり、すべてが特定の状態に達すると、何かが発生するはずです)。
または、タッチに応答し、ステータスを確認できる複数のオブジェクトを画面に表示するためのより良い方法はありますか?
@jqpubliqは正しいですが、本当にすべてのビューを確認したい場合は、ViewGroup
のgetChildCount()
メソッドとgetChildAt()
メソッドを使用できます。残りは単純な再帰メソッドで行います。
再帰関数の小さな例を作成しました。
public void recursiveLoopChildren(ViewGroup parent) {
for (int i = 0; i < parent.getChildCount(); i++) {
final View child = parent.getChildAt(i);
if (child instanceof ViewGroup) {
recursiveLoopChildren((ViewGroup) child);
// DO SOMETHING WITH VIEWGROUP, AFTER CHILDREN HAS BEEN LOOPED
} else {
if (child != null) {
// DO SOMETHING WITH VIEW
}
}
}
}
関数は、ViewGroup
内のすべてのビュー要素(最初から最後のアイテムまで)のループを開始します。子がViewGroup
の場合、その子で関数を再起動して、その中のすべてのネストされたビューを取得します子。
Views
を使用すると、動きがある場合に何かをうまくレンダリングするのが非常に困難になるようです。本当に静的なことをしているのでない限り、おそらくCanvas
に描画するか、OpenGL
を使用することをお勧めします。これが 素晴らしい話 昨年のI/O会議でのAndroidゲームの作成に関するものです。長いので、約15分スキップできます。ソースも利用できます。 。それはあなたに物事を進める方法の良いアイデアを与えるはずです
代替案
public static void recursivelyFindChildren(View view) {
if (view instanceof ViewGroup) {
//ViewGroup
ViewGroup viewGroup = (ViewGroup)view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
recursivelyFindChildren(viewGroup.getChildAt(i));
}
} else {
//View
}
}
または、次のアプローチを使用できるものを返すことができます
@Nullable
private static WebView recursivelyFindWebView(View view) {
if (view instanceof ViewGroup) {
//ViewGroup
ViewGroup viewGroup = (ViewGroup)view;
if (!(viewGroup instanceof WebView)) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
WebView result = recursivelyFindWebView(viewGroup.getChildAt(i));
if (result != null) {
return result;
}
}
} else {
//WebView
WebView webView = (WebView)viewGroup;
return webView;
}
}
return null;
}