/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.scenes.scene2d;
import com.badlogic.gdx.math.Vector2;
/** EventListener for low-level input events. Unpacks {@link InputEvent}s and calls the appropriate method. By default the methods
* here do nothing with the event. Users are expected to override the methods they are interested in, like this:
*
* <pre>
* actor.addListener(new InputListener() {
* public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
* Gdx.app.log("Example", "touch started at (" + x + ", " + y + ")");
* return false;
* }
*
* public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
* Gdx.app.log("Example", "touch done at (" + x + ", " + y + ")");
* }
* });
* </pre> */
public class InputListener implements EventListener {
static private final Vector2 tmpCoords = new Vector2();
public boolean handle (Event e) {
if (!(e instanceof InputEvent)) return false;
InputEvent event = (InputEvent)e;
switch (event.getType()) {
case keyDown:
return keyDown(event, event.getKeyCode());
case keyUp:
return keyUp(event, event.getKeyCode());
case keyTyped:
return keyTyped(event, event.getCharacter());
}
event.toCoordinates(event.getListenerActor(), tmpCoords);
switch (event.getType()) {
case touchDown:
return touchDown(event, tmpCoords.x, tmpCoords.y, event.getPointer(), event.getButton());
case touchUp:
touchUp(event, tmpCoords.x, tmpCoords.y, event.getPointer(), event.getButton());
return true;
case touchDragged:
touchDragged(event, tmpCoords.x, tmpCoords.y, event.getPointer());
return true;
case mouseMoved:
return mouseMoved(event, tmpCoords.x, tmpCoords.y);
case scrolled:
return scrolled(event, tmpCoords.x, tmpCoords.y, event.getScrollAmount());
case enter:
enter(event, tmpCoords.x, tmpCoords.y, event.getPointer(), event.getRelatedActor());
return false;
case exit:
exit(event, tmpCoords.x, tmpCoords.y, event.getPointer(), event.getRelatedActor());
return false;
}
return false;
}
/** Called when a mouse button or a finger touch goes down on the actor. If true is returned, this listener will receive all
* touchDragged and touchUp events, even those not over this actor, until touchUp is received. Also when true is returned, the
* event is {@link Event#handle() handled}.
* @see InputEvent */
public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
return false;
}
/** Called when a mouse button or a finger touch goes up anywhere, but only if touchDown previously returned true for the mouse
* button or touch. The touchUp event is always {@link Event#handle() handled}.
* @see InputEvent */
public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
}
/** Called when a mouse button or a finger touch is moved anywhere, but only if touchDown previously returned true for the mouse
* button or touch. The touchDragged event is always {@link Event#handle() handled}.
* @see InputEvent */
public void touchDragged (InputEvent event, float x, float y, int pointer) {
}
/** Called any time the mouse is moved when a button is not down. This event only occurs on the desktop. When true is returned,
* the event is {@link Event#handle() handled}.
* @see InputEvent */
public boolean mouseMoved (InputEvent event, float x, float y) {
return false;
}
/** Called any time the mouse cursor or a finger touch is moved over an actor. On the desktop, this event occurs even when no
* mouse buttons are pressed (pointer will be -1).
* @param fromActor May be null.
* @see InputEvent */
public void enter (InputEvent event, float x, float y, int pointer, Actor fromActor) {
}
/** Called any time the mouse cursor or a finger touch is moved out of an actor. On the desktop, this event occurs even when no
* mouse buttons are pressed (pointer will be -1).
* @param toActor May be null.
* @see InputEvent */
public void exit (InputEvent event, float x, float y, int pointer, Actor toActor) {
}
/** Called when the mouse wheel has been scrolled. When true is returned, the event is {@link Event#handle() handled}. */
public boolean scrolled (InputEvent event, float x, float y, int amount) {
return false;
}
/** Called when a key goes down. When true is returned, the event is {@link Event#handle() handled}. */
public boolean keyDown (InputEvent event, int keycode) {
return false;
}
/** Called when a key goes up. When true is returned, the event is {@link Event#handle() handled}. */
public boolean keyUp (InputEvent event, int keycode) {
return false;
}
/** Called when a key is typed. When true is returned, the event is {@link Event#handle() handled}. */
public boolean keyTyped (InputEvent event, char character) {
return false;
}
}