Получение текущего времени в миллисекундах всегда одинаково в Android OnTouchListener

#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:

Вам нужно создать глобальный список массивов и добавить миллисекунду при действии вниз и вверх и сравнить эти два значения.