2016-10-14 1 views
0

Je reçois la position des axes de mon contrôleur de manette bluetooth dans la méthode dispatchGenericMotionEvent(android.view. MotionEvent). Ma méthode:Obtenir la position actuelle de l'axe de manette de jeu Android

@Override 
public boolean dispatchGenericMotionEvent(final MotionEvent event) { 
    if(mPadListener==null || 
      (event.getSource()&InputDeviceCompat.SOURCE_JOYSTICK)!=InputDeviceCompat.SOURCE_JOYSTICK){ 
     return super.dispatchGenericMotionEvent(event); 
    } 

    int historySize = event.getHistorySize(); 
    for (int i = 0; i < historySize; i++) { 
     // Process the event at historical position i 
     Log.d("JOYSTICKMOVE",event.getHistoricalAxisValue(MotionEvent.AXIS_Y,i)+" "+event.getHistoricalAxisValue(MotionEvent.AXIS_Z,i)); 
    } 
    // Process current position 
    Log.d("JOYSTICKMOVE",event.getAxisValue(MotionEvent.AXIS_Y)+" "+event.getAxisValue(MotionEvent.AXIS_Z)); 

    return true; 
} 

Le problème est que lorsque je libère tous les axes du joystick, je ne reçois pas les dernières valeurs des axes (0,0) dans mon journal. Il s'arrête par exemple dans (0.23,0.11) et les valeurs appropriées n'apparaissent dans logcat qu'après l'événement de déplacement suivant. Quoi de plus - la situation est la même même si j'appuie sur le bouton normal (l'événement de bouton est complètement pris par une autre méthode dispatchKeyEvent(android.view.KeyEvent))

Que se passe-t-il?

Répondre

0

Vous obtenez un événement MotionEvent.ACTION_MOVE pour la position zéro, mais la valeur que vous recevez n'est pas nécessairement zéro. Vous devez obtenir la plage plate de la manette de jeu, ce qui vous donne les valeurs auxquelles nous devrions considérer la manette de jeu au repos (c'est-à-dire si nous sommes en dessous de la plage, nous sommes à la position zéro). Voir getCenteredAxis, qui corrige pour la plage plate (https://developer.android.com/training/game-controllers/controller-input.html):

private static float getCenteredAxis(MotionEvent event, 
     InputDevice device, int axis, int historyPos) { 
    final InputDevice.MotionRange range = 
      device.getMotionRange(axis, event.getSource()); 

    // A joystick at rest does not always report an absolute position of 
    // (0,0). Use the getFlat() method to determine the range of values 
    // bounding the joystick axis center. 
    if (range != null) { 
     final float flat = range.getFlat(); 
     final float value = 
       historyPos < 0 ? event.getAxisValue(axis): 
       event.getHistoricalAxisValue(axis, historyPos); 

     // Ignore axis values that are within the 'flat' region of the 
     // joystick axis center. 
     if (Math.abs(value) > flat) { 
      return value; 
     } 
    } 
    return 0; 
}