2016-08-01 1 views
0

Я автоматически прокручиваю scrollView до дна представления.Стоп scrollView прокрутка на сенсорном телефоне

scrollView.smoothScrollTo(0, scrollView.getBottom()); 

Если пользователь касается макета, мне нужно, чтобы остановить прокрутку & пребывания в текущем положении.

scrollView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       //// TODO: 01/08/16 STOP SCROLLING 
      } 
      return false; 
     } 
    }); 

Я пробовал smoothScrollBy(0,0);, но он не работает.

ответ

0

Ну, я решил это, используя ObjectAnimator. Это не только элегантно работало как решение, но и давало мне контроль над скоростью прокрутки.

я заменил

scrollView.smoothScrollTo(0, scrollView.getBottom()); 

с

objectAnimator = ObjectAnimator 
       .ofInt(scrollView, "scrollY", scrollView.getBottom()) 
       .setDuration(3000); 
objectAnimator.start(); 

, а затем

scrollView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        objectAnimator.cancel(); 
       } 
       return false; 
      } 
     }); 
0

Одним из подходов может быть использование smoothScrollToPosition, которое останавливает любое существующее движение прокрутки. Обратите внимание, что для этого метода требуется уровень API> = 8 (Android 2.2, Froyo). Обратите внимание, что если текущая позиция находится далеко от желаемой позиции, то плавная прокрутка займет довольно много времени и выглядит немного отрывистым (по крайней мере, в моем тестировании на Android 4.4 KitKat). Я также обнаружил, что комбинация вызова setSelection и smoothScrollToPosition иногда может заставлять позицию «пропустить» немного, это, похоже, происходит только тогда, когда текущая позиция была очень близка к желаемой позиции.

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

Я использовал следующий метод

private void smartScrollToPosition(ListView listView, int desiredPosition) { 
    // If we are far away from the desired position, jump closer and then smooth scroll 
    // Note: we implement this ourselves because smoothScrollToPositionFromTop 
    // requires API 11, and it is slow and janky if the scroll distance is large, 
    // and smoothScrollToPosition takes too long if the scroll distance is large. 
    // Jumping close and scrolling the remaining distance gives a good compromise. 
    int currentPosition = listView.getFirstVisiblePosition(); 
    int maxScrollDistance = 10; 
    if (currentPosition - desiredPosition >= maxScrollDistance) { 
     listView.setSelection(desiredPosition + maxScrollDistance); 
    } else if (desiredPosition - currentPosition >= maxScrollDistance) { 
     listView.setSelection(desiredPosition - maxScrollDistance); 
    } 
    listView.smoothScrollToPosition(desiredPosition); // requires API 8 
} 

В моем обработчику для кнопки, то я назвал это следующим образом

case R.id.action_go_to_today: 
    ListView listView = (ListView) findViewById(R.id.lessonsListView); 
    smartScrollToPosition(listView, 0); // scroll to top 
    return true; 

Приведенный выше непосредственно не ответить на ваш вопрос, но если вы можете когда текущая позиция находится на нужной позиции или рядом с ней, возможно, вы можете использовать smoothScrollToPosition, чтобы остановить прокрутку.

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