Использование функции встряхивания для открытия различных действий - PullRequest
0 голосов
/ 07 января 2019

У меня есть домашняя страница, которая ссылается на 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 голосов
/ 07 января 2019

Отказ от ответственности: я не разработчик Android и не имею никакого опыта с этим. Я не проверял свое решение

Не звоните startActivity(), пока пользователь не перестанет трясти телефон. Вы можете узнать это, взглянув на последние несколько различий в ускорении. Если это достаточно мало, чтобы больше не считаться тряской, наконец, вы можете вызвать 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);
            }
        }
    }

Редактировать: , как указал Гейб, разница должна быть очень низкой по сравнению с несколькими вызовами onSensorChanged (), чтобы пользователь действительно прекратил трясти свой телефон

...