My question is straightforward.
I have some ClickListener
s added to an Actor. I want to execute a click event on them programmatically.
Something like myActor.performClick()
;
My question is straightforward.
I have some ClickListener
s added to an Actor. I want to execute a click event on them programmatically.
Something like myActor.performClick()
;
You can also use:
InputEvent event1 = new InputEvent();
event1.setType(InputEvent.Type.touchDown);
button.fire(event1);
InputEvent event2 = new InputEvent();
event2.setType(InputEvent.Type.touchUp);
button.fire(event2);
This will also show any pressed image change which can be helpful.
I figured out a solution :
public static void performClick(Actor actor) {
Array<EventListener> listeners = actor.getListeners();
for(int i=0;i<listeners.size;i++)
{
if(listeners.get(i) instanceof ClickListener){
((ClickListener)listeners.get(i)).clicked(null, 0, 0);
}
}
}
This method can be called passing the actor on whom click needs to be performed
I do it like this (seems nicer to me):
public void triggerButtonClicked(Button button) {
InputEvent inputEvent = Pools.obtain(InputEvent.class);
inputEvent.reset();
inputEvent.setButton(0);
inputEvent.setRelatedActor(button);
try {
inputEvent.setType(InputEvent.Type.touchDown);
button.fire(inputEvent);
inputEvent.setType(InputEvent.Type.touchUp);
button.fire(inputEvent);
} finally {
Pools.free(inputEvent);
}
}
If you want to simulate user clicking on a visible actor, then you can find a point inside actor and tell InputProcessor to send touch events there.
// a point in the middle of the actor
val middle = actor.localToScreenCoordinates(Vector2(
this.width / 2,
this.height / 2
))
// simulate left mouse button press and release
Gdx.input.inputProcessor.touchDown(
middle.x.toInt(),
middle.y.toInt(),
0,
Input.Buttons.LEFT
)
Gdx.input.inputProcessor.touchUp(
middle.x.toInt(),
middle.y.toInt(),
0,
Input.Buttons.LEFT
)
Depending on actor style, touch down event can issue a change in actor's appearance which require being on the LibGDX's main thread. So if you are not on that thread (for example, simulating a click from a JUnit test case) then Gdx.input.inputProcessor.touchDown
and touchUp
have to be inside Gdx.app.postRunnable
block.