我正在开发一款适用于 Android 的游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后我会插入这个类的几个实例作为主视图的子视图。每个实例都会处理检测它何时被按下(通过 OnTouchListener)。
我现在遇到的问题是如何遍历所有这些子视图,以便我可以读取它们的状态并处理它们?(即,当他们都达到某种状态时,应该发生一些事情)。
或者有没有更好的方法在屏幕上显示几个响应触摸的对象以及我可以检查其状态的对象?
我正在开发一款适用于 Android 的游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后我会插入这个类的几个实例作为主视图的子视图。每个实例都会处理检测它何时被按下(通过 OnTouchListener)。
我现在遇到的问题是如何遍历所有这些子视图,以便我可以读取它们的状态并处理它们?(即,当他们都达到某种状态时,应该发生一些事情)。
或者有没有更好的方法在屏幕上显示几个响应触摸的对象以及我可以检查其状态的对象?
我做了一个递归函数的小例子:
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
}
}
}
}
该函数将开始循环 a 内的所有视图元素ViewGroup
(从第一个项目到最后一个项目),如果一个孩子是 aViewGroup
然后用该孩子重新启动该函数以检索该孩子内的所有嵌套视图。
@jqpubliq 是对的,但如果你真的想浏览所有视图,你可以简单getChildCount()
地getChildAt()
使用ViewGroup
. 一个简单的递归方法将完成其余的工作。
试试这个。获取父布局中的所有视图并返回视图数组列表。
public List<View> getAllViews(ViewGroup layout){
List<View> views = new ArrayList<>();
for(int i =0; i< layout.getChildCount(); i++){
views.add(layout.getChildAt(i));
}
return views;
}
如果有运动,使用Views
听起来很难很好地渲染任何东西。除非您正在做一些真正静态的事情,否则您可能想要绘制到 aCanvas
或 using 。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;
}