手柄测试
在浏览器中测试手柄按键、摇杆、扳机、方向键和震动
左摇杆
右摇杆
扳机
震动测试
按键记录
什么是手柄测试?
手柄测试通过 W3C Gamepad API 读取控制器发送给浏览器的信号,并实时展示:每一次按键、摇杆位置、扳机深度、方向键方向和震动马达。它是开打前确认手柄是否正常、排查面键连击、发现老手柄摇杆漂移、验证双震动马达是否都工作的最快方式。页面在 Xbox 风格的布局上高亮每一个输入,显示摇杆和扳机的原始数值,并保留简短的事件记录。由于 Gamepad API 只有在你按下手柄上的按键后才会暴露控制器,页面会先提示你按任意键——这是浏览器的安全规则,不是手柄故障。所有操作都在浏览器本地完成,输入数据不会离开你的设备。
使用方法
如何使用
- 通过 USB 或蓝牙连接手柄
- 按下手柄上的任意键以激活
- 观察屏幕布局随按键和摇杆移动而高亮
- 使用震动按钮测试振动马达
- 查看按键记录确认每次按压都已识别
提示
- 绿色高亮表示输入已正确到达浏览器
- 控制器只有在按下任意键后才会出现——这是浏览器的安全规则
- 震动支持取决于浏览器和手柄,Firefox 支持最广
- 若摇杆静止时数值不为 0,漂移标签会提示摇杆漂移
- 多个已连接的手柄可通过槽位标签切换
使用场景
技术原理
浏览器通过 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 标准(部分藏在实验性扩展里,浏览器支持很差),因此无法从浏览器可靠测试。