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

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

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

    }
};

最佳答案

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

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

09-04 04:32