2016-10-14 19 views
0

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に表示されます。さらに、普通のボタンを押しても状況は変わりません(ボタンイベントはまったく別の方法でキャッチされます)

何が起こっているのですか?

答えて

0

ゼロ位置のMotionEvent.ACTION_MOVEイベントが発生しますが、受け取る値は必ずしもゼロではありません。ジョイスティックの平らな範囲を取得する必要があります。これは、ジョイスティックを静止状態とみなすべき値を与えます(つまり、平坦な範囲を下回っていればゼロになります)。フラットレンジ(https://developer.android.com/training/game-controllers/controller-input.html)を修正するgetCenteredAxisを参照してください。

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; 
} 
関連する問題