Android手柄数据全解析
前言
功能需要,获取物理手柄数据(本文章只针对处于Android模式的手柄),然后转换成云需要的数据。手柄数据主要分为两款,一个是轴数据,一个是按键数据,下面分别来说明。
判断是否是手柄设备
public static boolean isJoyStick(InputEvent event) {
boolean sourceJoy = (event.getSource() & InputDevice.SOURCE_JOYSTICK) ==
InputDevice.SOURCE_JOYSTICK || (event.getSource() & InputDevice.SOURCE_GAMEPAD) ==
InputDevice.SOURCE_GAMEPAD;
boolean hasJoyMotion = event.getDevice().getMotionRange(MotionEvent.AXIS_X) != null && event.getDevice().getMotionRange(MotionEvent.AXIS_Y) != null;
return sourceJoy && hasJoyMotion;
}
一是判断是否还有左滚轴,二是判断是否来源是手柄,至于为什么判断是否包含左滚轴,因为市面上很多遥控器都有轴且设备源包含手柄。加上左滚轴判断可以更精确。
按键数据
按键数据可通过dispatchKeyEvent or onKeyDown,onKeyUp获得,手柄数据如下:
- KeyEvent.KEYCODE_BUTTON_A : 手柄A键
- KeyEvent.KEYCODE_BUTTON_B : 手柄B键
- KeyEvent.KEYCODE_BUTTON_X : 手柄X键
- KeyEvent.KEYCODE_BUTTON_Y : 手柄Y键
- KeyEvent.KEYCODE_BUTTON_THUMBL : 手柄左滚轴按下
- KeyEvent.KEYCODE_BUTTON_THUMBR : 手柄右滚轴按下
- KeyEvent.KEYCODE_BUTTON_START : 手柄Start键
- KeyEvent.KEYCODE_BUTTON_SELECT : 手柄Select键(部分手柄叫BACK)
- KeyEvent.KEYCODE_BUTTON_L1 : 手柄L1键(部分设备LB键)
- KeyEvent.KEYCODE_BUTTON_R1 : 手柄R1键 (部分设备RB键)
- KeyEvent.KEYCODE_BUTTON_L2 : 手柄L2键(部分设备LT键)
- KeyEvent.KEYCODE_BUTTON_R2 : 手柄R2键(部分设备RT键)
轴数据
轴数据通过onGenericMotionEvent(MotionEvent event)此方法传递。
通常手柄的有轴数据的功能组为,左摇杆,有摇杆,方向盘与 L2,R2两个扳机键,除L2与R2只对应一个轴值外其他设备均对应X,Y两个轴值,下面一一介绍:
左摇杆
对应轴:MotionEvent.AXIS_X,MotionEvent.AXIS_Y
取值范围: [-1.0 , 1.0]
说明:X代表横向数据,Y代表纵向数据。
轴数据的获取方式为:
value = event.getAxisValue(MotionEvent.AXIS_X);//左摇杆X轴
value = event.getAxisValue(MotionEvent.AXIS_Y);//左摇杆Y轴
右摇杆
对应轴:MotionEvent.AXIS_Z,MotionEvent.AXIS_RZ
取值范围: [-1.0 , 1.0]
说明:Z代表横向数据,RZ代表纵向数据。
轴数据的获取方式为:
value = event.getAxisValue(MotionEvent.AXIS_Z);//右摇杆X轴
value = event.getAxisValue(MotionEvent.AXIS_RZ);//右摇杆Y轴
方向盘
对应轴:MotionEvent.AXIS_HAT_X,MotionEvent.AXIS_HAT_Y
取值范围: [-1.0 , 1.0]
说明:AXIS_HAT_X代表横向数据,AXIS_HAT_Y代表纵向数据。X == 1.0 && Y == 0 代表右边,其他方位参考此值。
轴数据的获取方式为:
value = event.getAxisValue(MotionEvent.AXIS_HAT_X);//方向盘X轴
value = event.getAxisValue(MotionEvent.AXIS_HAT_Y);//方向盘Y轴
左右扳机键(L2,R2)
部分手柄没有此轴。
对应轴:MotionEvent.AXIS_LTRIGGER,MotionEvent.AXIS_RTRIGGER
取值范围: [0 , 1.0]
轴数据的获取方式为:
value = event.getAxisValue(MotionEvent.AXIS_LTRIGGER);//左扳机
value = event.getAxisValue(MotionEvent.AXIS_RTRIGGER);//右扳机
结束
本篇文章对应的手柄模式需为Android模式,xBoxOne跟xBox360模式需读取usb数据且是另外一套数据解析模式。后续再说。Over。