为了账号安全,请及时绑定邮箱和手机立即绑定

震动侦听器检测到过多的震动

震动侦听器检测到过多的震动

慕仙森 2023-06-14 16:11:33
我在我的应用程序中实现了一个震动检测器来掷骰子。每次摇动,每个骰子都会掷一次。问题是,当我摇动手机时,它会一次“掷”多次骰子。我试过添加延迟并更改灵敏度,但都没有用。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;        if (shake > 12) {            // roll dice        }    }    @Override    public void onAccuracyChanged(Sensor sensor, int accuracy) {    }};
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

我认为您可以尝试通过这种方式获得解决方案。


使用 Handler 会增加一个时间延迟,并且对于多个 senson 响应,它只会对最后一个满足的条件采取行动,并且 previoulsy 调用一次将从回调中删除。


private Handler handler = new Handler();


private Runnable runnable = new Runnable() {

    public void run() {

        // roll dice     

    }

};


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;


    if (shake > 12) {

        try {

            handler.removeCallbacks(runnable);

            handler.postDelayed(runnable, 1000);

        } catch(Exception e) {

            e.printStackTrace();

        }

    }

}


@override

public void onStop() {

    super.onStop();

    handler.removeCallbacks(runnable);

}

如果您需要来自传感器的任何东西,您可以删除一个类变量并在条件中更新它if (shake > 12),以便可以在可运行的环境中使用。


查看完整回答
反对 回复 2023-06-14
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

通过添加一个布尔值“rolled”,并在掷骰子时将其设置为真,您只能掷一次骰子。您可以通过将值设置回 false 来再次滚动。


private static boolean rolled = false;

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;


        if (shake > 12 && !rolled) {

            // roll dice

            rolled = true;

        }

    }


    @Override

    public void onAccuracyChanged(Sensor sensor, int accuracy) {


    }

};


查看完整回答
反对 回复 2023-06-14
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信