【问题标题】:Android HorizontalScrollView Repeated Auto-Scroll in a LoopAndroid Horizo​​ntalScrollView 在循环中重复自动滚动
【发布时间】:2016-07-11 23:14:09
【问题描述】:

我需要自动滚动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);

任何帮助将不胜感激。 TIA。

【问题讨论】:

    标签: android android-layout horizontal-scrolling horizontalscrollview


    【解决方案1】:

    修改并尝试这个....

    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);
    

    【讨论】:

      【解决方案2】:

      @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();
      
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        相关资源
        最近更新 更多