#android #ontouchlistener
#Android #ontouchlistener
Вопрос:
Я разрабатываю приложение для Android. В моем приложении мне нужно получить текущую миллисекунду времени в OnTouchListener. Что я делаю, так это когда я касаюсь представления, я запоминаю это время в миллисекундах, затем при касании выхода я вычисляю разницу во времени между первым касанием и выходом.
Мой код приведен ниже:
//about container is a linear layout
aboutContainer.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
long timeWhenDown = System.currentTimeMillis();
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
timeWhenDown = System.currentTimeMillis();
}
if(event.getAction()==MotionEvent.ACTION_UP)
{
Toast.makeText(getBaseContext(),String.valueOf(timeWhenDown) " - " String.valueOf(System.currentTimeMillis()),Toast.LENGTH_SHORT).show();
}
return false;
}
});
Как вы можете видеть в приведенном выше коде, я запоминаю время, когда пользователь касается макета, затем указываю значение текущего времени в миллисекундах и время, когда пользователь коснулся. Касание завершается через несколько секунд. Но при выходе он поджаривает то же значение, что и на скриншоте ниже.
Почему эти два значения одинаковы? На самом деле это должно быть по-другому, поскольку время касания и касания не совпадают. Что не так с моим кодом? Как я могу правильно запомнить время?
Ответ №1:
Вам нужно объявить переменную timeWhenDown
как глобальную переменную вне функции ontouch, потому что таким образом каждое событие касания timeWhenDown
возвращается к новому значению
public class MainActivity extends AppCompatActivity {
View aboutContainer;
long timeWhenDown;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aboutContainer = (View)findViewById(R.id.aboutContainer);
aboutContainer.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction () == MotionEvent.ACTION_DOWN)
{
timeWhenDown = System.currentTimeMillis();
}
else if(event.getAction() == MotionEvent.ACTION_UP)
{
Toast.makeText(getBaseContext(),String.valueOf(timeWhenDown) " - " String.valueOf(System.currentTimeMillis()),Toast.LENGTH_SHORT).show();
}
return true;
}
});
}
}
Я протестировал код, и он работает нормально.
Комментарии:
1. Я сделал. Я объявил это как свойство класса Activity. Но не работает. Точно так же.
2. Вы заменили
long timeWhenDown = System.currentTimeMillis();
наtimeWhenDown = System.currentTimeMillis();
? Похоже, это проблема.3. Я отредактировал свой ответ с помощью правильного кода, вы также возвращали false, что останавливает диспетчера от проверки другого события касания, которое должно вернуть true
Ответ №2:
Вам нужно создать глобальный список массивов и добавить миллисекунду при действии вниз и вверх и сравнить эти два значения.