在我的情况下,我在 Xinput 模式下使用 Logitech F310(它有一个开关可以在 DirectInput 和 Xinput 之间进行选择)。我写了一个小应用程序,它读取游戏手柄的轴值。事实证明,右侧模拟摇杆使用轴MotionEvent.AXIS_RX
,MotionEvent.AXIS_RY
而两个肩部模拟触发器使用轴MotionEvent.AXIS_Z
和MotionEvent.AXIS_RZ
。
但根据文档AXIS_Z 和 AXIS_RZ 应该用于正确的模拟摇杆:
公共静态最终 int AXIS_RZ
轴常数:运动事件的 Z 旋转轴。
对于操纵杆,报告关于 Z 轴的绝对旋转角度。该值被标准化为从 -1.0(逆时针)到 1.0(顺时针)的范围。在带有两个模拟操纵杆的游戏手柄上,该轴通常被重新解释为报告第二个操纵杆的绝对 Y 位置。
这是游戏中的一个问题,它不提供重新映射游戏手柄的按钮和模拟摇杆的选项。例如 GTA San Andreas 认为这两个模拟触发器是正确的模拟摇杆。但由于触发器的中性值在未按下时为 -1 而不是 0,就像模拟摇杆处于中性状态一样,相机不断旋转。(此游戏中使用右侧模拟摇杆移动相机)
轴映射保存在哪里?它是在游戏手柄中硬编码的吗?还是在 Linux 设备子系统中分配?或者可能在 android InputDevice 框架内?如果是这样,它可以改变吗?
另一种可能的解决方案是拦截事件调度程序和接收应用程序之间的 MotionEvents 并更改轴值。在android中这或类似的可能吗?甚至可能在较低级别:通过 root 访问,可以从 /dev/input/event6 设备(在我的情况下 event6 是游戏手柄)读取原始输入数据。是否可以用调整后的轴值不断覆盖这个文件?