Gestures

IntermediateProgrammer

Gestures are predefined pointer patterns. Xenko can recognize gestures and trigger corresponding events. For example, in a strategy game, the player can drag and drop a unit to the battlefield with a drag gesture. Gestures can use one or several fingers.

Note

All lengths, speeds and error margins of configuration files must use normalized values.

Turn on gesture recognition

By default, the input system doesn't recognize gestures, as this requires CPU time.

To turn on gesture recognition:

  • Create an instance of the configuration class for the gesture you want to recognize. For example, for the drag gesture, create an instance of GestureConfigDrag.
  • Configure the class parameters.
  • Add the gesture configuration to the Gestures collection.
Warning

After you activate recognition for a gesture, you can't modify the gesture's parameters. If you need to do this, delete the gesture from the Gestures collection and create a new entry with new parameters.

Turn off gesture recognition

Delete the gesture from the InputManager.Gestures collection.

Gesture recognition

When the input system detects a gesture, it adds a GestureEvent to the list of InputManager.GestureEvents. The event contains information about the gesture and its state, such as its location and the number of fingers used.

Note

Each gesture has its own associated gesture event class (see below).

The GestureEvent.Type field indicates which gesture has been recognized. You can then cast the base gesture event into the gesture-specific event type to have gesture-type-specific information about the event.

Xenko can detect several gestures simultaneously, so the event list can contain more than one item in an update.

The list is cleared with every update, so you don't need to clear it manually.

Configure gestures

In the GestureConfig classes, you can configure parameters including:

  • the number of fingers the gesture uses

  • the number and duration of taps the gesture uses

  • the gesture direction

Note

Each gesture has its own configuration class with specific configuration parameters (see below).

Types of gesture

Xenko supports two main types of gesture:

  • Discrete gestures (tap, flick, long press) trigger a single event.

  • Continuous gestures (drag and composite) trigger a series of events when the user changes the direction of the gesture.

Discrete gestures

Tap

Tap gesture

The user touches the screen and quickly removes their finger.

Configuration class: GestureConfigTap

Event class: GestureEventTap

The number of fingers on the screen can't vary during the gesture. To set the number of fingers required for a tap, modify RequiredNumberOfFingers.

Tip

To distinguish single taps from multi-taps, the system uses latency in tap events. To disable this, set the GestureConfigTap.MaximumTimeBetweenTaps field to 0.

Flick

Flick gesture

The user touches the screen, performs a quick straight translation, and withdraws their finger(s).

Configuration class: GestureConfigFlick

Event class: GestureEventFlick

The number of fingers on the screen can't during the gesture.

To set a minimum length for the flick gesture, use GestureConfigFlick.MinimumFlickLength.

To restrict the direction of the flick to vertical or horizontal, use GestureConfigFlick.FlickShape.

Long press

Long press gesture

The user touches the screen and maintains pressure without removing their finger for a certain period of time (the default time is one second).

Configuration class: GestureConfigLongPress

Event class: GestureEventLongPress

The number of fingers on the screen can't vary during the gesture.

To change the minimum press length for the long press gesture, modify GestureConfigLongPress.RequiredPressTime.

Continuous gestures

Drag

Drag gesture

The user touches the screen, performs a translation, and withdraws their finger(s).

Configuration class: GestureConfigDrag

Event class: GestureEventDrag

The number of fingers on the screen can't vary during the gesture.

To detect smaller drags, decrease GestureConfigDrag.MinimumDragDistance.

To restrict the direction of the drag to vertical or horizontal, use GestureConfigDrag.DragShape.

Composite

Translation gestureScale gestureRotation gesture

The user touches the screen with two fingers and moves them independently.

Configuration class: GestureConfigComposite

Event class: GestureEventComposite

The composite gesture requires exactly two fingers on the screen. It's triggered when the system detects one of the three basic actions:

  • Translation: the user translates two fingers together in the same direction.
  • Scale: the user moves two fingers closer together or further apart.
  • Rotation: the user rotates two fingers around a center point.

Gesture states

A gesture always has one of four states:

  • Began

  • Changed

  • Ended

  • Occurred

Discrete gestures (tap, flick, long press) always have the state occurred. Continuous gestures (drag and composite) always begin with the state began, followed by any changed states, and end with the ended state.

To query the current state of a gesture, use the GestureEvent.State field of the triggered gesture event.

Example code

Activate or deactivate gesture recognition

To create the configuration of a gesture you want to recognize:

  1. // Create the configuration of a gesture you want to recognize.
  2. var singleTapConfig = new GestureConfigTap();
  3. // Start tap gesture recognition.
  4. Input.Gestures.Add(singleTapConfig);
  5. // Create the configuration of the gesture you want to recognize.
  6. var doubleTapConfig = new GestureConfigTap(2, 1);
  7. // Start double tap gesture recognition.
  8. Input.Gestures.Add(doubleTapConfig);
  9. // Stop tap gesture recognition.
  10. Input.Gestures.Remove(singleTapConfig);
  11. // Stop all gesture recognitions.
  12. Input.Gestures.Clear();

Configure the gesture

Each configuration class has a parameterless constructor that corresponds to the default gesture configuration. You can use special constructors for frequently-modified parameters.

Warning

We don't recommend you modify other fields as this might break the input system. But if you need to, you can modify them using the corresponding properties.

  1. // Default gesture config.
  2. var singleTapConfig = new GestureConfigTap();
  3. // Personalize gesture config using the dedicated constructor.
  4. var doubleTapConfig = new GestureConfigTap(2, 2);
  5. // Personalize gesture config by directly accessing the desired property.
  6. // Make sure you know what you're doing! Modifying this might break the input system.
  7. var noLatencyTap = new GestureConfigTap() { MaximumTimeBetweenTaps= TimeSpan.Zero };

Access gesture events

You can access the list of events triggered by recognized gestures using the InputManager.GestureEvents collection. The collection is automatically cleared at every update.

  1. var currentFrameGestureEvents = Input.GestureEvents;

Identify the gesture type

Use the GestureEvent.Type field to identity the gesture type, then cast it to the appropriate event type to get extra information about the event.

  1. foreach( var gestureEvent in Input.GestureEvents)
  2. {
  3. // Determine if the event is from a tap gesture
  4. if (gestureEvent.Type != GestureType.Tap)
  5. continue;
  6. // Cast a specific tap event class.
  7. GestureEventTap tapEvent = (GestureEventTap) gestureEvent;
  8. // Access tap-event-specific field.
  9. log.Info("Tap position: {0}.", tapEvent.TapPosition);
  10. }

Identify the gesture state

Use the GestureEvent.State field to get gesture event state.

  1. switch(compositeGestureEvent.State)
  2. {
  3. case GestureState.Began:
  4. image.ComputePreview();
  5. break;
  6. case GestureState.Changed:
  7. image.TransformPreview(compositeGestureEvent.TotalScale, compositionGestureEvent.TotalRotation);
  8. break;
  9. case GestureState.Ended:
  10. image.TransformRealImage(compositeGestureEvent.TotalScale, compositionGestureEvent.TotalRotation);
  11. break;
  12. default:
  13. break;
  14. }

See also