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






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值