2016-02-09 2 views
0

Я создаю приложение для Android на Java, в котором у меня есть много <TextView> вокруг экрана, и все они определены с помощью onTouchListeners. Они завернуты в <ScrollView>, потому что они занимают больше места, чем доступно на экране.Android - как обнаружить прикосновение на экране - это «свиток»?

Моя проблема: когда я прокручиваю приложение вверх/вниз, прикоснувшись к экрану и двигая пальцем вверх/вниз, прокрутка работает так, как ожидалось, но также запускается onTouchListener прикосновения <TextView> (что, вероятно, ожидаемый) - я не хочу, чтобы это произошло. Я хочу, чтобы onTouchListener игнорировался, когда я касался экрана, чтобы прокрутить его.

Как это сделать? Я не хочу, чтобы моя функция запускалась, когда пользователь прокручивается и «случайно» запускает onTouchListener по определенному <TextView>.

+1

проверить это, это может помочь http://stackoverflow.com/questions/34916506/animated-expandablelistview-in-scrollview/34916626#34916626 – pratik

+0

Вы можете ссылаться на это решение http://stackoverflow.com/questions/ 3087255/android-how-to-listen-for-scrolling-events –

ответ

6

После поиска больше, я нашел this solution по Stimsoni. Идея состоит в том, чтобы проверить, меньше ли времени между событиями ACTION_DOWN и ACTION_UP, чем значение, заданное ViewConfiguration.getTapTimeout().

Из документации:

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

Код:

view.setOnTouchListener(new OnTouchListener() { 

    private long startClickTime; 

    @Override 
    public boolean onTouch(View view, MotionEvent event) { 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 

      startClickTime = System.currentTimeMillis(); 

     } else if (event.getAction() == MotionEvent.ACTION_UP) { 

      if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) { 

       // Touch was a simple tap. Do whatever. 

      } else { 

       // Touch was a not a simple tap. 

      } 

     } 

     return true; 
    } 

}); 
+0

спасибо, это помогло мне – Chris623

+0

@ Chris623 Спасибо! Рад, что это помогло. – Hamsterrific

0

Вы можете идентифицировать движущиеся, как это:

view.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      if(event.getAction() == MotionEvent.ACTION_MOVE) 
      { 

      } 

      return false; 
     } 
    }); 
+0

Спасибо; хотя на самом деле не решила мою проблему, это дало мне идеи для поиска больше, и я смог решить проблему. Большое спасибо. – Hamsterrific

0

У меня была такая же проблема, как и вы, и я решил его с ACTION_CANCEL.

motionEvent.getActionMasked() равно ACTION_CANCEL когда действие воспринимается ранее (как ACTION_DOWN в вашем случае) «отменен» в настоящее время другими жестами, как прокрутка и т.д. ваш код может выглядеть так:

view.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent e) { 
     if (e.getActionMasked() == MotionEvent.ACTION_DOWN) { 
      // perceive a touch action. 
     } else if(e.getActionMasked() == MotionEvent.ACTION_UP || 
       e.getActionMasked() == MotionEvent.ACTION_CANCEL) { 
      // ignore the perceived action.  
     } 
    } 

Я надеюсь, это помогает.

Смежные вопросы