使用摇一摇功能打开不同的活动

Using the Shake Feature to open different activities

我有一个链接到 4 个不同活动(页面)的主页。我已经使用 SensorEventListener 实现了摇动功能并且它响应正确但是我现在只能用它来打开一个 activity 例如:我可以让它摇动一次来打开一个 activity 或摇动两次以打开 activity 但不会同时打开这两个 if 语句。

我试过使用带边界的 if 和 else 语句,因为我知道如何设置摇动次数,但我不明白如何让程序检测到完全等待我在它之前做了多少次摇动做任务。

 private final SensorEventListener sensorListener = new SensorEventListener() {

    @Override
    public void onSensorChanged(SensorEvent event) {

        Intent tts = new Intent(context, ttsScreen.class);
        Intent stt = new Intent(context, sttScreen.class);
        Intent cbb = new Intent(context, cbbScreen.class);
        Intent ocr = new Intent(context, ocrScreen.class);

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        acelLast = acelValue;
        acelValue = (float) Math.sqrt((double) (x*x + y*y + z*z));
        float difference = acelValue - acelLast;
        shake = shake * 0.9f + difference;

        if(shake > 12 && shake < 24 ) {
            startActivity(tts);
        }
        else if (shake > 24 && shake < 36) {
            startActivity(stt);
        }
        else if (shake > 36 && shake < 48) {
            startActivity(cbb);
        }
        else if (shake > 48) {
            startActivity(ocr);
        }


    }

在我的 onCreate 方法中,我有以下内容:

 sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
 sm.registerListener(sensorListener,sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);

 acelValue = SensorManager.GRAVITY_EARTH;
 acelLast = SensorManager.GRAVITY_EARTH;
 shake = 0.00f;

目前它将始终打开 startActivity(tts)。我不确定我需要采取什么方法,但我在想也许是一个计时器或其他东西,以便它在打开 activity 之前完全检查我做了多少次摇动。或者 if/else 方法不是正确的方法吗?

免责声明:我不是 android 开发人员,也没有这方面的经验。我还没有测试我的解决方案

在用户停止摇动 phone 之前不要调用 startActivity()。您可以通过查看加速度的最后几个差异来发现这一点。如果它足够低以至于不再算作摇晃,那么您最终可以使用正确的 Intent 调用 startActivity。

private final SensorEventListener sensorListener = new SensorEventListener() {
    private float differenceMedian = 0f;

    @Override
    public void onSensorChanged(SensorEvent event) {

        Intent tts = new Intent(context, ttsScreen.class);
        Intent stt = new Intent(context, sttScreen.class);
        Intent cbb = new Intent(context, cbbScreen.class);
        Intent ocr = new Intent(context, ocrScreen.class);

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        acelLast = acelValue;
        acelValue = (float) Math.sqrt((double) (x*x + y*y + z*z));
        float difference = acelValue - acelLast;
        shake = shake * 0.9f + difference; // will increase shake as long as user continues to shake (I think?)

        // differenceMedian will relatively slowly drop towards 0 when difference stays low
        differenceMedian =  (difference + differenceMedian ) /2; 

        if(differenceMedian < 1){ // depends. try to adjust the 1 here
            if(shake > 12 && shake <= 24 ) { // please notice <= because what if shake is exactly 24? same for following else-ifs.
                startActivity(tts);
            }
            else if (shake > 24 && shake <= 36) {
                startActivity(stt);
            }
            else if (shake > 36 && shake <= 48) {
                startActivity(cbb);
            }
            else if (shake > 48) {
                startActivity(ocr);
            }
        }
    }

编辑: 正如 Gabe 指出的那样,多次调用 onSensorChanged() 时差异必须非常低,以确保用户确实停止摇晃他们的 phone