2016-10-14 16 views
0

Я получаю положение осей от моего контроллера геймпада bluetooth в dispatchGenericMotionEvent(android.view. MotionEvent) методе. Мой метод:Получение текущего положения оси геймпада геймпада

@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; 
} 

Проблема заключается в том, что, когда я выпускаю всех осей джойстика, я не получаю последние топоры значения (0,0) в моем журнале. Он останавливается, например, в (0,23,0.11), и соответствующие значения появляются в logcat только после следующего события перемещения. Более того - ситуация такая же, даже если я нажимаю обычную кнопку (событие кнопки улавливается полностью другим способом dispatchKeyEvent(android.view.KeyEvent))

Что происходит?

ответ

0

Вы получаете событие MotionEvent.ACTION_MOVE для нулевой позиции, но полученное вами значение не обязательно равно нулю. Вам нужно получить плоский диапазон джойстика, который дает вам значения, при которых мы должны учитывать, что джойстик находится в состоянии покоя (т. Е. Если мы находимся ниже плоского диапазона, то мы находимся в нулевой позиции). См. GetCenteredAxis, который корректирует для плоского диапазона (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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^