2016-07-19 8 views
0

Я пытаюсь сделать приложение вроде «Heads up» только для более активного использования !!Проблема с логикой при использовании акселерометра

, но теперь я столкнулся с некоторой логической проблемой при использовании акселерометра в своем приложении.

Я хочу, чтобы приложение «тост» при нажатии на него (акселерометр дает -7 в этом положении) и тост «неправильно» при наклоне (акселерометр дает 7 или более в этом положении).

Но проблема заключалась в том, что приложение тост многократно повторялось в каждой позиции. поэтому я использовал логическое (isToasted), чтобы сделать тост для приложения один раз в каждой из этих позиций. Но теперь это совсем не тост!

где моя проблема и что мне делать?

это часть моих кодов:

Boolean isToasted = false; 

@Override 
public void onSensorChanged(SensorEvent event) { 
    int sensorValue = (int) event.values[2]; 

    while (isToasted) { 
     switch (sensorValue) { 
      case 7: { 
       Toast.makeText(find_word2.this, "wrong", Toast.LENGTH_SHORT).show(); 
       isToasted = true; 
       break; 
      } 
      case -7: { 
       Toast.makeText(find_word2.this, "correct", Toast.LENGTH_SHORT).show(); 
       isToasted = true; 
       break; 
      } 
     } 
    } 
    if (sensorValue == 0) isToasted = false; //sensorValue = 0 means device is not tilted and it's in direct position. 
} 
+0

любые журналы ошибок или трассировка стека? – Shek

+0

нет журнала ошибок –

+0

isToasted никогда не будет правдой с вашим текущим кодом. По умолчанию установлено значение false. – Compass

ответ

0

Причина, по которой будет отображать Toast несколько раз в каждой позиции происходит потому, что SensorEvent может произойти multiple times в одной позиции:

Обратите внимание, что «на изменилось» является то неправильным, так как это также будет , если у нас есть новое считывание с датчика с точно такими же значениями датчика (но более новая метка времени).

Таким образом, каждый раз, когда есть SensorEvent, который имеет одну из Z-значений, указанных в вашем заявлении переключатель будет отображаться Toast. Вы были на правильном пути, добавив значение boolean, чтобы отслеживать, было ли сообщение уже отображено, но цикл while, который у вас есть, никогда не будет выполнен, потому что isToasted установлен в false.

На самом деле, вам даже не нужен цикл. Все, что вам нужно сделать, это проверить, находится ли значение z между двумя значениями. Если это так, вы установите для параметра boolean значение true. Если нет, вы проверяете, является ли значение boolean истинным, а значение z находится выше или ниже диапазона. Затем вы можете установить Toast соответственно и установить boolean на false, чтобы сообщение не отображалось во второй раз.

private boolean isReset = true; 
private float mMaxValue = 7; 
private float mDeadZone = 5; 

@Override 
public void onSensorChanged(SensorEvent event) { 
    float value = event.values[2]; 

    if(value >= mDeadZone || value <= -mDeadZone) { 
     if(isReset && value <= -mMaxValue) { 
      Toast.makeText(find_word2.this, "correct", Toast.LENGTH_SHORT).show(); 
      isReset = false; 
     } else if(isReset && value >= mMaxValue) { 
      Toast.makeText(find_word2.this, "wrong", Toast.LENGTH_SHORT).show(); 
      isReset = false; 
     } 
    } else { 
     isReset = true; 
    } 
} 

Вы также можете создать «мертвую зону», сделав круг во внешнем if заявлении ниже максимального значения. Это гарантирует, что пользователю придется сбросить устройство ближе к нулю до того, как снова отобразится Toast.

+0

ах спасибо. Я попробовал это, и теперь он работает правильно, показывая «неправильно», но он не тост «правильно» вообще! –

+0

@ahmadmohseni Ах, моя вина. Значение 'значение' должно было быть обернуто в функцию' Math.abs() 'или просто использовать простой оператор' || '. Я отредактировал ответ, теперь он должен работать. – Bryan

+0

@ahmadmohseni Я сделал простую [скрипку] (http://ideone.com/wuLL20), которая имитирует 'onSensorChanged'. Он выводит значение «SensorEvent» z, а также «правильно», если значение равно или меньше -7 и «неверно», если значение равно или выше 7. В этом случае 'isReset' всегда истинно, потому что Я всегда возвращаю значение до нуля после каждого вызова. – Bryan

0

Разница между делать-то время и пока что делать-то время оценивает свое выражение в нижней части цикла, а не в верхней части. Следовательно, операторы в блоке do всегда выполняются в как минимум один раз.

+0

Это создаст бесконечный цикл для каждого вызова 'onSensorChanged()', потому что 'sensorValue' никогда не изменяется во время одного вызова. Если вы полностью удаляете цикл, это должно работать должным образом. – Bryan

+0

@Bryan вы правы – Shek