摇一摇监听器触发多次骰子滚动问题求助(已尝试延迟与灵敏度调整)
解决摇一摇多次触发骰子滚动的问题
我懂你这头疼的点——摇一次手机,骰子却反复触发滚动,调了延迟和灵敏度都没改善,实在闹心!咱们来看看怎么给你的代码加个“防重复触发”的机制。
问题根源
你当前的代码只判断了shake是否超过阈值,但手机摇晃过程中,传感器会连续多次触发onSensorChanged回调,只要shake一直高于12,就会不断执行掷骰子的逻辑,自然就会重复触发了。
解决方案:添加冷却(Cooldown)机制
最直接有效的办法就是给摇一摇功能加个“冷却期”——触发一次掷骰子后,在指定时间内不再响应新的摇晃请求。具体修改如下:
先在类里添加两个成员变量:
// 冷却时间,可根据需求调整,这里设为2秒(2000毫秒) private static final long SHAKE_COOLDOWN_MS = 2000; // 记录上次触发掷骰子的时间戳 private long lastShakeTriggerTime = 0;修改
onSensorChanged里的判断逻辑,先检查冷却时间,再判断摇晃强度:private final SensorEventListener sensorListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent sensorEvent) { float x = sensorEvent.values[0]; float y = sensorEvent.values[1]; float z = sensorEvent.values[2]; acelLast = acelVal; acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z)); float delta = acelVal - acelLast; shake = shake * 0.9f + delta; // 获取当前时间 long currentTime = System.currentTimeMillis(); // 先检查是否过了冷却期,再判断摇晃强度是否达标 if (shake > 12 && (currentTime - lastShakeTriggerTime) > SHAKE_COOLDOWN_MS) { // 更新上次触发的时间戳 lastShakeTriggerTime = currentTime; // 这里执行掷骰子逻辑 // roll dice } // 可选优化:当摇晃强度降到很低时,重置shake值,避免残留数值影响下次判断 if (shake < 0.5f) { shake = 0; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } };
为什么这个方法管用?
冷却时间SHAKE_COOLDOWN_MS会确保在一次掷骰子触发后的指定时间内,哪怕传感器还在输出摇晃数据,也不会重复执行掷骰子逻辑。你可以根据实际体验调整这个时间,比如1500毫秒(1.5秒)也是很常用的选择。
另外那个可选的shake重置逻辑,能避免摇晃结束后shake值一直处于高位,导致下次轻轻碰一下就触发的问题,进一步提升体验。
内容的提问来源于stack exchange,提问作者Palmboom333
相关产品推荐
相关产品推荐

