摇晃监听器检测到过多的摇晃

时间:2019-08-19 11:47:39

标签: java android

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

我尝试添加一个延迟并更改灵敏度,但是没有一个起作用。

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 个答案:

答案 0 :(得分:1)

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

使用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)下对其进行更新,以便可以在可运行状态中使用它。

答案 1 :(得分:0)

通过添加一个布尔值“ rolled”,并在掷骰子时将其设置为true,则只能掷骰子一次。然后,您可以通过将该值重新设置为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) {

    }
};