我有一个具有关卡选择菜单的手机游戏。菜单包括每页15个级别的按钮和4个页面。可以通过滑动屏幕来更改页面。可以通过按钮(可以在按钮上开始和结束)进行滑动,而不会触发任何按钮。可以点击按钮,这应该激活他们的touchUp()方法。
目前拖动工作正常但水平选择按钮未处理touchUp事件。
我通过创建一个与整个屏幕大小相同的actor来完成此操作。它表现为dragHandler actor,它可以检测touchDown,touchDragged和touchUp。它运作正常。
在dragHandler actor(在舞台上)下面是当用户拖动它时在屏幕上移动的所有关卡按钮actor。由于dragHandler位于按钮上方,因此不会调用按钮touchDown或touchUp方法,而是在dragHandler中处理事件。
在我的dragHandlers InputListeners touchUp方法中,我有一段代码可以检查拖动是否足够长,可以解释为拖动。如果不是,则应将事件标记为未处理。但是,InputListeners touchUp方法原型返回一个void,因此无法告诉较低级别该事件未被真正处理(触摸似乎已标记为已在touchDown方法中处理)。
以下是我在dragHandler中的InputListener版本:
dragHandler.addListener(new MyInputListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
// Mark dragging on, save drag start position
dragStartX = x;
isDragging = true;
return true;
}
@Override
public boolean touchUp(InputEvent event, float x, float y, int pointer, int button) {
// If the drag was long enough, mark the event as handled
if (Math.abs(dragXOffset) >= minDrag) {
// Do stuff
return true;
}
else
// Return false to tell that this event was not yet handled,
// and should be handled by another actor (in this case, a level select button)
return false;
}
public void touchDragged(InputEvent event, float x, float y, int pointer) {
dragXOffset = x - dragStartX;
updateLevelButtonPositionsToDraggedX();
}
}
我创建了一个名为MyInputListener的新类,它与原始的InputListener.java完全相同,但我更改了touchUp方法以返回布尔值而不是void,并更改了switch-case以返回其结果(而不是一个恒定的真实)。然而,这并没有任何影响。我想这是因为touchDown事件已经在dragHandler中处理了,所以touchUp不能再被另一个EventListener处理了。
所有演员都在同一个舞台上,应用程序输入处理器被设置为舞台。如果我将dragHandler放在按钮actor下面,则总是在按钮顶部触发touchUp事件时调用按钮的touchUp方法。我不想在拖动后触摸touchUp来触发任何按钮的touchUp事件。
有没有什么方法可以通过类似于我已经完成的方法实现我想要的目标?
感谢您的时间!