可触摸禁用后的 Scene2d 单击事件
Scene2d click event after touchable disabled
假设我们有下一个演员的场景:
- WidgetGroup 根;
- 按钮按钮。
其中 button 是 root 的子节点。
现在看看接下来的步骤:
- 按下按钮;
- 将 root 可触摸设置为禁用;
- 修饰按钮;
- 按钮点击事件发生。
在我看来,这看起来很不对。当然 TouchListener 有 cancel() 方法,我们可以直接为按钮调用它来修复它,但是如果 root 由十几个可触摸的 actor 组成......
那么,我是不是漏掉了什么或者禁用整个组触摸的正确方法是什么?
这里经过讨论https://github.com/libgdx/libgdx/issues/2789
现在最好的解决方案可能是编写取消整个组层次结构的触摸焦点的实用方法。像这样:
public static void cancelTouchFocus(Stage stage, Actor actor) {
stage.cancelTouchFocus(actor);
if (actor instanceof Group) {
SnapshotArray<Actor> children = ((Group)actor).getChildren();
if (children.size > 0) {
Object[] snapshot = children.begin();
for (int i = 0; i < children.size; i++) {
cancelTouchFocus(stage, (Actor)snapshot[i]);
}
children.end();
}
}
}
当然你可以只调用 Stage#cancelTouchFocus(Actor actor)
但在这种情况下你可能会破坏这个特定组之外的其他一些参与者的活动触摸周期。
查看上述 github 问题以获取其他解决方案和想法。
假设我们有下一个演员的场景:
- WidgetGroup 根;
- 按钮按钮。 其中 button 是 root 的子节点。
现在看看接下来的步骤:
- 按下按钮;
- 将 root 可触摸设置为禁用;
- 修饰按钮;
- 按钮点击事件发生。
在我看来,这看起来很不对。当然 TouchListener 有 cancel() 方法,我们可以直接为按钮调用它来修复它,但是如果 root 由十几个可触摸的 actor 组成......
那么,我是不是漏掉了什么或者禁用整个组触摸的正确方法是什么?
这里经过讨论https://github.com/libgdx/libgdx/issues/2789
现在最好的解决方案可能是编写取消整个组层次结构的触摸焦点的实用方法。像这样:
public static void cancelTouchFocus(Stage stage, Actor actor) {
stage.cancelTouchFocus(actor);
if (actor instanceof Group) {
SnapshotArray<Actor> children = ((Group)actor).getChildren();
if (children.size > 0) {
Object[] snapshot = children.begin();
for (int i = 0; i < children.size; i++) {
cancelTouchFocus(stage, (Actor)snapshot[i]);
}
children.end();
}
}
}
当然你可以只调用 Stage#cancelTouchFocus(Actor actor)
但在这种情况下你可能会破坏这个特定组之外的其他一些参与者的活动触摸周期。
查看上述 github 问题以获取其他解决方案和想法。