此情况适用于以下情况:
①:两个Actor,当其中一个Actor被点击后,需要调用另外一个Actor的点击事件,也就是两实现同一个功能
②:此方式特别适用与新手教程中
观察libgdx源代码得知:
①:在点下的时候,Stage中的touchDown方法被调用,此时会调用代码:
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.touchDown);
event.setStage(this);
event.setStageX(tempCoords.x);
event.setStageY(tempCoords.y);
event.setPointer(pointer);//pointer一般是0
event.setButton(button);//button一般是0
Actor target = hit(tempCoords.x, tempCoords.y, true);//获取到点击点所在的可以响应的Actor
//Actor target=hitActor.hit(tmpCoors.x,tmpCoors.y, true);//从某个Actor或者Group中获取Actor
if (target == null) {
if (root.getTouchable() == Touchable.enabled) root.fire(event);
} else {
target.fire(event);
}
Pools.free(event);
在上述代码片段中,调用target.fire(event)相当于开始调用target的touchDown方法,此时在Actor中的notify(Event event, boolean capture)方法会执行以下代码:
for (int i = 0, n = listeners.size; i < n; i++) {
EventListener listener = listeners.get(i);
if (listener.handle(event)) {
event.handle();
if (event instanceof InputEvent) {
InputEvent inputEvent = (InputEvent)event;
if (inputEvent.getType() == Type.touchDown) {//只有在TouchDown时会执行
event.getStage().addTouchFocus(listener, this, inputEvent.getTarget(), inputEvent.getPointer(),
inputEvent.getButton());
}
}
}
}
②:在抬起时,Stage中的touchUp方法会调用,主要代码如下:
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.touchUp);
event.setStage(this);
event.setStageX(tempCoords.x);
event.setStageY(tempCoords.y);
event.setPointer(pointer);
event.setButton(button);
SnapshotArray<TouchFocus> touchFocuses = this.touchFocuses;
TouchFocus[] focuses = touchFocuses.begin();
for (int i = 0, n = touchFocuses.size; i < n; i++) {
TouchFocus focus = focuses[i];
if (focus.pointer != pointer || focus.button != button) continue;
if (!touchFocuses.removeValue(focus, true)) continue; // Touch focus already gone.
event.setTarget(focus.target);
event.setListenerActor(focus.listenerActor);
if (focus.listener.handle(event)) event.handle();//执行touchUp方法
Pools.free(focus);
}
touchFocuses.end();
Pools.free(event);
通过上述代码,可以得知,在点下的时候,会向stage中的touchFocus集合中添加一个对象,然后再抬起的时候,遍历touchFocus集合,如果pointer和button都是一样的,就会通过touchFocus对象中记录的actor和该actor的listener执行touchUp方法。
InputEvent event=Pools.obtain(InputEvent.class);
event.setType(Type.touchDown);
event.setStageX(stageX);
event.setStageY(stageY);
event.setPointer(0);
event.setButton(0);
hitActor.stageToLocalCoordinates(tmpCoors.set(stageX, stageY));
Actor target=hitActor.hit(tmpCoors.x,tmpCoors.y, true);
if (target!=null) {
target.fire(event);
}else {
if (hitActor.getTouchable()==Touchable.enabled) {
hitActor.fire(event);
}
}
Pools.free(event);