@Override public boolean onGenericMotion(View v, MotionEvent event) { if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0 && event.getAction() == MotionEvent.ACTION_MOVE) { List<MotionRange> motionRanges = event.getDevice().getMotionRanges(); for(MotionRange mr : motionRanges){ int axis = mr.getAxis(); if(event.getAxisValue(axis) > 0.5 || event.getAxisValue(axis) < -0.5){ Log.i(TAG, "Axis found: " + MotionEvent.axisToString(axis)); this.mAxisName = MotionEvent.axisToString(axis); mValueTextView.setText(mAxisName); } } }else{ Log.i(TAG, "Not a joystick event."); } return true; }
private float getAxisValue(MotionEvent motionEvent, int axis) { InputDevice device = InputDevice.getDevice(mDeviceId); if (device == null) { return 0f; } MotionRange range = device.getMotionRange(axis, motionEvent.getSource()); if (range == null) { return 0f; } final float flat = range.getFlat(); final float value = motionEvent.getAxisValue(axis); if (Math.abs(value) > flat) { return value; } return 0f; }
/** * Normalizes joystick values between -1.0 and 1.0. Though Android guarantees * this, it is a useful function if one finds that the joystick values are not * correct. Doesn't do any harm to call it. */ public static float processAxis(InputDevice.MotionRange range, float axisvalue) /*************************************************************************/ { float absAxisValue = Math.abs(axisvalue); float deadZone = range.getFlat(); if (absAxisValue <= deadZone) { return 0.0f; } float normalizedValue; if (axisvalue < 0.0f) { normalizedValue = absAxisValue / range.getMin(); } else { normalizedValue = absAxisValue / range.getMax(); } return normalizedValue; }
@Override public boolean dispatchGenericMotionEvent(MotionEvent event) { int source = event.getSource(); if ((source & InputDevice.SOURCE_JOYSTICK) != InputDevice.SOURCE_JOYSTICK) { return false; } mHorizontalFactor = event.getAxisValue(MotionEvent.AXIS_X); mVerticalFactor = event.getAxisValue(MotionEvent.AXIS_Y); InputDevice device = event.getDevice(); MotionRange rangeX = device.getMotionRange(MotionEvent.AXIS_X, source); if (Math.abs(mHorizontalFactor) <= rangeX.getFlat()) { mHorizontalFactor = event.getAxisValue(MotionEvent.AXIS_HAT_X); MotionRange rangeHatX = device.getMotionRange(MotionEvent.AXIS_HAT_X, source); if (Math.abs(mHorizontalFactor) <= rangeHatX.getFlat()) { mHorizontalFactor = 0; } } MotionRange rangeY = device.getMotionRange(MotionEvent.AXIS_Y, source); if (Math.abs(mVerticalFactor) <= rangeY.getFlat()) { mVerticalFactor = event.getAxisValue(MotionEvent.AXIS_HAT_Y); MotionRange rangeHatY = device.getMotionRange(MotionEvent.AXIS_HAT_Y, source); if (Math.abs(mVerticalFactor) <= rangeHatY.getFlat()) { mVerticalFactor = 0; } } return true; }