Android HorizontalScrollView повторяет автоматическую прокрутку в цикле

Мне нужно сделать HorizontalScrollView автоматической прокруткой.

Под автоматическим я подразумеваю, что он должен:

  1. Автоматическая плавная прокрутка слева направо
  2. Как только правый край будет достигнут, плавно прокрутите назад, то есть справа налево.
  3. Повторяйте 1 и 2 бесконечно.

Я пробовал следующую реализацию, которая, похоже, не работает полностью. (Вид прокручивается от L до R, но не может прокручиваться от R до L)

Timer timer = new Timer("horizontalScrollViewTimer");
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                if (horizontalScrollView.canScrollHorizontally(View.FOCUS_RIGHT)) {
                    horizontalScrollView.smoothScrollBy(5, 0);
                } else {
                    while (horizontalScrollView.canScrollHorizontally(View.FOCUS_LEFT)) {
                        horizontalScrollView.smoothScrollBy(-5, 0);
                        if (!horizontalScrollView.canScrollHorizontally(View.FOCUS_LEFT)) {
                            break;
                        }
                    }
                }

             }
        });
    }
}, 3000, 50);

Любая помощь будет оценена. ТИА.


person jazdev    schedule 24.03.2016    source источник


Ответы (2)


измени и попробуй....

private boolean scrollingLeft = false;

....

Timer timer = new Timer("horizontalScrollViewTimer");
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (scrollingLeft) {
                        if (horizontalScrollView.getScrollX() == 0) {
                            horizontalScrollView.smoothScrollBy(5, 0);
                            scrollingLeft = false;
                        } else {
                            horizontalScrollView.smoothScrollBy(-5, 0);
                        }
                    } else {
                        if (horizontalScrollView.canScrollHorizontally(View.FOCUS_RIGHT)) {
                            horizontalScrollView.smoothScrollBy(5, 0);
                        } else {
                            horizontalScrollView.smoothScrollBy(-5, 0);
                            scrollingLeft = true;
                        }
                    }
                }
            });
        }
    }, 3000, 50);
person soumyadip001    schedule 12.08.2017

Ответ @soumyadip001 не сработал для меня, потому что scrollingLeft никогда не был истинным, но это мое решение сработало для меня. С помощью этого решения вы можете добиться бесконечного цикла.

  int scrollAmount =0; //compute scrolling amount
  boolean scrollingLeft = false;

   //get the view at the rightmost part of the horizontalscrollview
   View viewRight = horizontalScrollView.getChildAt(horizontalScrollView.getChildCount() - 1);

  Timer timer = new Timer("horizontalScrollViewTimer");
  timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    if (!scrollingLeft) {
                        horizontalScrollView.smoothScrollBy(5, 0);
                        scrollAmount+= 5; //increment scroll amount
                        if (scrollAmount >= viewRight.getRight()) { //check 
                            scrollingLeft = true;
                        }
                    }
                    else {
                        if (scrollingLeft ) {
                            horizontalScrollView.smoothScrollBy(-5, 0);
                            scrollAmount-=5;
                            if(scrollAmount<=0) {
                                scrollingLeft = false;
                                scrollAmount =0;
                            }
                        }
                    }
                }
            });
        }
    }, 3000, 50);

Примечание: отключите таймер onPause, чтобы избежать утечки памяти или сбоя.

 onPause(){
   if(timer!=null)
     timer.cancel();

 }
person leeCoder    schedule 14.11.2019