此情況適用於以下情況:
①:兩個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);