ToolAct工具行动

手柄测试

在浏览器中测试手柄按键、摇杆、扳机、方向键和震动

未检测到手柄
请连接手柄并按下任意键以激活
LBRBYXBA

左摇杆

X 轴: 0.00Y 轴: 0.00
已居中

右摇杆

X 轴: 0.00Y 轴: 0.00
已居中

扳机

LT
0.00
RT
0.00

震动测试

当前手柄或浏览器不支持震动。

按键记录

按下手柄按键开始测试...

什么是手柄测试?

手柄测试通过 W3C Gamepad API 读取控制器发送给浏览器的信号,并实时展示:每一次按键、摇杆位置、扳机深度、方向键方向和震动马达。它是开打前确认手柄是否正常、排查面键连击、发现老手柄摇杆漂移、验证双震动马达是否都工作的最快方式。页面在 Xbox 风格的布局上高亮每一个输入,显示摇杆和扳机的原始数值,并保留简短的事件记录。由于 Gamepad API 只有在你按下手柄上的按键后才会暴露控制器,页面会先提示你按任意键——这是浏览器的安全规则,不是手柄故障。所有操作都在浏览器本地完成,输入数据不会离开你的设备。

使用方法

如何使用

  1. 通过 USB 或蓝牙连接手柄
  2. 按下手柄上的任意键以激活
  3. 观察屏幕布局随按键和摇杆移动而高亮
  4. 使用震动按钮测试振动马达
  5. 查看按键记录确认每次按压都已识别

提示

  • 绿色高亮表示输入已正确到达浏览器
  • 控制器只有在按下任意键后才会出现——这是浏览器的安全规则
  • 震动支持取决于浏览器和手柄,Firefox 支持最广
  • 若摇杆静止时数值不为 0,漂移标签会提示摇杆漂移
  • 多个已连接的手柄可通过槽位标签切换

使用场景

诊断失灵或连击的按键依次轻按每个面键、肩键和方向键,观察屏幕布局根据真实按键状态亮起。按键记录会记下每一次按下和松开,因此单次按压触发两次、或完全不响应的开关会立刻与正常按键形成对比。
检测摇杆漂移将两个摇杆置于中心,读取实时 X/Y 数值。正常的摇杆静止时应接近 0.00;当摇杆静止时某一轴超过约 0.12,漂移标签会变橙——这是摇杆模块磨损的典型症状,会让角色或光标自行偏移。
验证扳机线性度缓慢扣动 LT 和 RT,观察数值在扳机条上从 0.00 升到 1.00。扳机如果跳变、过早满值或达不到满值,说明电位器磨损——在怪罪赛车游戏的油门手感之前,先确认这一点很有用。
独立测试震动马达轻震、强震和双震动按钮通过 GamepadHapticActuator API 分别驱动高频和低频马达。如果只有一档能震,说明有一个马达坏了;如果完全没反应,要么手柄、要么浏览器不支持震动,页面会明确提示这一点。
识别并切换多个手柄状态面板显示每个手柄的厂商 ID 字符串、映射类型(标准/非标准)、槽位、按键数和轴数。配对多个手柄时,槽位标签让你无需重新连接即可在它们之间切换——适合本地多人开打前检查一整套手柄。

技术原理

浏览器通过 W3C Gamepad API 暴露手柄。一个控制器由从 navigator.getGamepads() 获取的 Gamepad 对象表示,该函数返回最多四个槽位。每个 gamepad 携带一个 id 字符串(厂商和产品)、一个 mapping 字段(Xbox 布局设备为 'standard',否则为空)、一个 buttons 数组和一个 axes 数组。 在标准映射下,buttons 有 17 项:四个面键(A/B/X/Y)、两个肩键(LB/RB)、两个模拟扳机(LT/RT)、Select/Start、两个摇杆按下(L3/R3)、四个方向键和 Home/Guide 键。每个按钮暴露 .pressed(布尔)和 .value(0 到 1——扳机是模拟量,数字按键为 0 或 1)。axes 数组保存四个 -1 到 1 的值:左摇杆 X/Y,再右摇杆 X/Y。 该 API 是轮询式而非事件式,因此页面运行 requestAnimationFrame 循环,每帧读取一个新快照。为避免手柄静止时无意义的重渲染,仅当 gamepad.timestamp 变化时才更新状态——该时间戳在每份新输入报告上递增。连接和断开通过 window 的 gamepadconnected 和 gamepaddisconnected 事件到达。 出于安全,gamepad 对象在用户按下手柄上的按键前保持 null,因此页面无法静默读取刚插入的手柄。震动是可选功能:如果 gamepad.vibrationActuator 存在,调用 playEffect('dual-rumble', { duration, weakMagnitude, strongMagnitude }) 即可驱动两个马达;Safari 和部分 Chromium 版本未实现该功能,这也是页面做特性检测并在不支持时禁用按钮的原因。

  • navigator.getGamepads() 返回最多四个槽位;只有在按下手柄按键后对应槽位才非 null。
  • 标准映射:buttons[0-3] 面键、[4-5] 肩键、[6-7] 模拟扳机、[8-9] Select/Start、[10-11] L3/R3、[12-15] 方向键、[16] Home。
  • axes[0-1] 为左摇杆(X、Y),axes[2-3] 为右摇杆,取值范围均为 -1 到 1。
  • 轮询模型:requestAnimationFrame 循环读取快照;以 gamepad.timestamp 作为门控,静止帧不做任何更新。
  • 震动通过 gamepad.vibrationActuator.playEffect('dual-rumble', ...) 实现——需特性检测,并非所有浏览器都支持。
  • gamepadconnected / gamepaddisconnected 事件表示连接和断开;手柄的 .index 标识其槽位。

示例

按下面键

按下 A -> buttons[0].pressed = true,value = 1.0

推动左摇杆

左摇杆推向右上 -> axes[0] = 0.71,axes[1] = -0.68

扣动扳机

RT 扣到一半 -> buttons[7].value = 0.50,pressed = false(低于阈值)

常见问题

为什么插上手柄后没有反应?

Gamepad API 会一直隐藏控制器,直到你按下手柄上的按键,以防止网页静默指纹识别已连接的设备。通过 USB 或蓝牙连接手柄、聚焦本标签页后,按下任意键——状态面板就会切换为「已连接」。这个激活步骤是浏览器的安全规则,并非故障。

支持哪些控制器?

浏览器以标准映射暴露的任何控制器:Xbox One/Series 手柄、DualShock 4 和 DualSense(多数系统会映射为标准),以及大多数通用 USB 手柄。无论蓝牙还是 USB,浏览器都会将它们归一为同样的 17 按键、4 轴布局。非标准手柄仍可使用,但按键顺序可能与屏幕标签不一致。

为什么震动不工作?

震动支持因环境而异。Firefox 支持最广;Chrome 和 Edge 在较新版本支持;Safari 未实现。手柄本身也必须暴露 gamepad.vibrationActuator。页面会检测这一点,并在不支持时明确提示「不支持」,而不是静默无反应,因此震动缺失是浏览器或硬件限制,不是本工具的问题。

摇杆没碰却显示数值,是坏了吗?

接近 0 的小数值是正常的死区噪声。如果摇杆静止时某一轴超过约 0.12,漂移标签会变橙——这就是典型的摇杆漂移,由电位器模块磨损引起,属于硬件问题,通常会随时间恶化;本工具让你在怪游戏之前先确认。

数据会上传到服务器吗?

不会。Gamepad API 完全在浏览器本地读取。按键、摇杆位置和震动命令都不会离开你的设备,不会被记录或传输。

能测试 DualSense 自适应扳机、触摸板或陀螺仪吗?

不能。标准 Gamepad API 只暴露按键、摇杆轴和基础震动。DualSense 自适应扳机、电容触摸板和体感传感器不属于 Web 标准(部分藏在实验性扩展里,浏览器支持很差),因此无法从浏览器可靠测试。