猿问

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

我在我的应用程序中实现了一个震动检测器来掷骰子。每次摇动,每个骰子都会掷一次。问题是,当我摇动手机时,它会一次“掷”多次骰子。


我试过添加延迟并更改灵敏度,但都没有用。


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) {


    }

};


慕仙森
浏览 112回答 2
2回答

隔江千里

我认为您可以尝试通过这种方式获得解决方案。使用 Handler 会增加一个时间延迟,并且对于多个 senson 响应,它只会对最后一个满足的条件采取行动,并且 previoulsy 调用一次将从回调中删除。private Handler handler = new Handler();private Runnable runnable = new Runnable() {    public void run() {        // roll dice         }};private final SensorEventListener sensorListener = new SensorEventListener() {@Overridepublic 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();        }    }}@overridepublic void onStop() {    super.onStop();    handler.removeCallbacks(runnable);}如果您需要来自传感器的任何东西,您可以删除一个类变量并在条件中更新它if (shake > 12),以便可以在可运行的环境中使用。

慕桂英546537

通过添加一个布尔值“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) {    }};
随时随地看视频慕课网APP

相关分类

Java
我要回答