Libgdx中InputListener事件的觸控監聽的手動調用

此情況適用於以下情況:

①:兩個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方法。


通過以上代碼,可以得知,只需要在第一個Actor點擊的時候,對另外一個Actor進行以下設置,既可完成觸控監聽的手動調用:

		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);






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章