2010-04-08 65 views
24

我正在为Android设计游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后我会插入这个类的几个实例作为主视图的子节点。每个实例都会处理检测它何时被按下(通过OnTouchListener)。遍历Android视图的所有子视图?

我现在面临的问题是如何循环所有这些子视图,以便我可以读取它们的状态并处理它们? (即,当他们都达到某种状态应该发生)。

或者有更好的方法让屏幕上有多个响应触摸的对象,并且我可以检查其状态吗?

回答

17

@jqpubliq是对一个好主意,但如果你真的想通过所有的观点,你可以简单地使用getChildCount()getChildAt()方法从ViewGroup。一个简单的递归方法将完成剩下的工作。

1

使用Views听起来好像它会很残酷地很难渲染任何东西,如果有移动。您可能想要绘制到Canvas或使用OpenGL,除非您正在做一些非常静态的事情。以下是去年制作Android游戏的I/O会议的great talk。它的种类很长,你可以跳过大约15分钟。另外源也可用。这应该给你的方式去了解事情

+0

是的,我需要做一个不同的方式,但我会先尝试这个。这是一个休闲游戏。 – Slapout 2010-04-14 02:29:35

41

我已经做了递归函数的一个小例子:

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然后重新启动该子项的功能可以检索该子项中的所有嵌套视图。

+0

不起作用。当视图包含webView时 – Karacago 2015-10-06 11:52:57

+2

您选择了'for(int i = parent.getChildCount() - 1; i> = 0; i - )'而不是'for(int i = 0; i 2017-08-23 12:15:28

+0

@PeterProkop我个人更喜欢这个循环。即使在循环过程中删除循环的一个元素,它也可以很好地工作。 – 2017-11-07 04:47:25

0

为什么不只是使用数组或矢量来保持这些视图的轨迹?这将是我认为最简单和最有效的方式。