使用“摇动功能”打开其他活动

时间:2019-01-07 13:36:29

标签: java android accelerometer shake

我有一个主页,它链接到4个不同的活动(页面)。我已经使用SensorEventListener实现了摇动功能,并且它可以正确响应,但是例如,目前我只能用它来打开一个活动:我可以摇动一次来打开一个活动,或者摇动两次来打开一个活动活动,但不是一次同时包含这两个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)。我不确定我应该采取哪种方法,但是我在想也许是计时器或其他工具,以便它可以在开始一项活动之前全面检查我进行了几次摇晃。还是if / else方法不是正确的方法?

1 个答案:

答案 0 :(得分:2)

免责声明:我不是android开发人员,对此没有经验。我尚未测试解决方案

在用户停止摇动手机之前,请勿拨打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()时,差异必须非常小,以确保用户确实停止了摇晃手机