美文网首页
Android手柄数据全解析

Android手柄数据全解析

作者: 小于先森 | 来源:发表于2021-11-18 18:03 被阅读0次

    前言

    功能需要,获取物理手柄数据(本文章只针对处于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手柄数据全解析

          本文链接:https://www.haomeiwen.com/subject/jecjtrtx.html