Deteccion de gestos - jackgris/wikiLibGDX_es GitHub Wiki

9.4 Detección de gestos

Las pantallas táctiles se desenvuelven bien con entradas basadas en gestos. Un gesto puede ser un toque con dos dedos para indicar el deseo de hacer zoom, un toque simple o doble, un toque prolongado y más cosas.

Libgdx dispone de un GestureDetector (source) que te permite detectar los siguientes gestos:

  • touchDown: Un usuario toca la pantalla
  • longPress: Un usuario toca la pantalla de forma prolongada
  • tap: Un usuario toca la pantalla brevemente. El dedo no debe desplazarse por ningún área alrededor de la zona de toque inicial para ser registrado. Se detectarán eventos múltiples si el usuario repite la acción durante un intervalo de tiempo específico.
  • pan: Un usuario desliza el dedo sobre la pantalla. El detector registrará las coordenadas del toque actual, así como la delta entre las posiciones de toque inicial y actual. Útil para implementar movimiento lateral de cámara en 2D.
  • panStop: Llamado al finalizar el deslizamiento.
  • fling: Un usuario desliza el dedo sobre la pantalla y lo levanta. Útil para implementar gestos de barrido.
  • zoom: Un usuario coloca dos dedos en la pantalla y los separa entre sí. El detector reportará las distancias iniciales y actuales entre los dedos en píxeles. Útil para implementar zoom de cámara.
  • pinch: Similar a zoom. El detector reportará las psoiciones iniciales y finales de los dedos, en lugar de la distancia entre ambos. Útil para implementar zoom de cámara y gestos más sofisticados, como rotación.

Un GestureDetector es un Event Handling disfrazado. Para atender a gestos, uno ha de implementar la interfaz GestureListener y pasarla al constructor del GestureDetector. El detector entonces es establecido como un InputProcessor, un InputMultiplexer o como el InputProcessor principal:

public class MyGestureListener implements GestureListener{

    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {

        return false;
    }

    @Override
    public boolean tap(float x, float y, int count, int button) {

        return false;
    }

    @Override
    public boolean longPress(float x, float y) {

        return false;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {

        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {

        return false;
    }

    @Override
    public boolean panStop(float x, float y, int pointer, int button) {

        return false;
    }

    @Override
    public boolean zoom (float originalDistance, float currentDistance){

       return false;
    }

    @Override
    public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer){

       return false;
    }
}
Gdx.input.setInputProcessor(new GestureDetector(new MyGestureListener()));

El GestureListener puede señalar si se consume el evento o si quiere que el mismo pase al siguiente InputProcessor devolviendo verdadero o falso, respectivamente, de sus métodos.

Como los eventos registrados en un InputProcessor normal, los respectivos métodos serán llamados justo antes de la llamada al ApplicationListener.render() en el hilo de renderizado.

El GestureDetector tiene también un segundo constructor que permite especificar varios parámetros para la detección de gestos. Consulta los Javadocs para más información.

Enlaces