#java #android #joystick #gamepad #pad
#java #Android #джойстик #геймпад #панель
Вопрос:
Я получаю положение осей от моего контроллера геймпада Bluetooth в dispatchGenericMotionEvent(android.view. MotionEvent)
методе. Мой метод:
@Override
public boolean dispatchGenericMotionEvent(final MotionEvent event) {
if( mPadListener==null ||
(event.getSource()amp;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 только после события next move. Более того — ситуация такая же, даже если я нажимаю обычную кнопку (событие кнопки перехватывается совершенно другим методом dispatchKeyEvent(android.view.KeyEvent)
)
Что происходит?
Ответ №1:
Вы получаете событие движения.Событие 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;
}