Ответ 1
@jqpubliq Правильно, но если вы действительно хотите пройти через все Представления, вы можете просто использовать методы getChildCount()
и getChildAt()
из ViewGroup
. Простой рекурсивный метод сделает все остальное.
Я работаю над игрой для Android. Чтобы помочь реализовать его, моя идея - создать подкласс представления. Затем я вставлял несколько экземпляров этого класса в качестве детей основного вида. Каждый экземпляр обрабатывал бы обнаружение при нажатии (через OnTouchListener).
Теперь проблема Im заключается в том, как я просматриваю все эти подзадачи, чтобы я мог читать их статусы и обрабатывать их? (I.e., когда все они достигают определенного состояния, должно произойти что-то).
Или есть лучший способ иметь несколько объектов на экране, которые реагируют на касание, и чей статус я могу проверить?
@jqpubliq Правильно, но если вы действительно хотите пройти через все Представления, вы можете просто использовать методы getChildCount()
и getChildAt()
из ViewGroup
. Простой рекурсивный метод сделает все остальное.
Я сделал небольшой пример рекурсивной функции:
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
, чтобы получить все вложенные представления внутри этого дочернего элемента.
Использование Views
звучит так, будто его жестоко сложно отобразить что угодно, если есть движение. Вероятно, вы хотите рисовать до Canvas
или с помощью OpenGL
, если вы не делаете что-то действительно статичное. Здесь отличная беседа из последних лет конференции ввода-вывода по созданию игр для 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;
}