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。

你可能感兴趣的:(Android,知识点,kotlin,Arouter,android)