Пропустить все просмотры в представлении Android?

Я работаю над игрой для Android. Чтобы помочь реализовать его, моя идея - создать подкласс представления. Затем я вставлял несколько экземпляров этого класса в качестве детей основного вида. Каждый экземпляр обрабатывал бы обнаружение при нажатии (через OnTouchListener).

Теперь проблема Im заключается в том, как я просматриваю все эти подзадачи, чтобы я мог читать их статусы и обрабатывать их? (I.e., когда все они достигают определенного состояния, должно произойти что-то).

Или есть лучший способ иметь несколько объектов на экране, которые реагируют на касание, и чей статус я могу проверить?

Ответ 1

@jqpubliq Правильно, но если вы действительно хотите пройти через все Представления, вы можете просто использовать методы getChildCount() и getChildAt() из ViewGroup. Простой рекурсивный метод сделает все остальное.

Ответ 2

Я сделал небольшой пример рекурсивной функции:

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 является ViewGroup затем перезапустите функцию с этим дочерним ViewGroup, чтобы получить все вложенные представления внутри этого дочернего элемента.

Ответ 3

Использование Views звучит так, будто его жестоко сложно отобразить что угодно, если есть движение. Вероятно, вы хотите рисовать до Canvas или с помощью OpenGL, если вы не делаете что-то действительно статичное. Здесь отличная беседа из последних лет конференции ввода-вывода по созданию игр для Android. Его вид длинный, и вы можете пропустить около 15 минут. Также доступен источник. Это должно дать вам хорошее представление о способах совершения вещей.

Ответ 4

Почему бы просто не использовать массив или вектор для отслеживания этих представлений? Это было бы самым простым и эффективным способом, я думаю.

Ответ 5

Альтернатива

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;
}