【问题标题】:Speed limit for scroll view滚动视图的速度限制
【发布时间】:2012-04-30 15:18:25
【问题描述】:

我的应用滚动速度非常快! 如何在我的 android 应用程序中限制滚动视图的滚动速度? 滚动可能非常快,以这种速度滚动毫无意义。

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    这个帖子很旧,但我会回复一个部分解决方案:限制投掷速度。请随时发表评论,以便我改进我的解决方案。

    如开发人员培训指南中所述:

    Flinging 是当用户快速拖动和抬起手指时发生的滚动类型。

    这就是我需要速度限制的地方。所以,在 Custom ScrollView 中(无论是水平的还是垂直的) 像这样覆盖 fling 方法。

    @Override
    public void fling(int velocityY) {
        int topVelocityY = (int) ((Math.min(Math.abs(velocityY), MAX_SCROLL_SPEED) ) * Math.signum(velocityY));
        super.fling(topVelocityY);
    }
    

    我发现velocityY(在水平滚动视图中为velocityX)可能在-16000和16000之间。负数只是意味着向后滚动。我仍在测试这个值,而且我只在一台设备上测试过它。不确定在旧设备/API 版本中是否相同。我稍后会回来编辑。

    (int) ((Math.min(Math.abs(velocityY), MAX_SCROLL_SPEED) ) * Math.signum(velocityY));
    

    我正在做的是获得我的常数 MAX_SCROLL_SPEED 和原始速度 Y 之间的最小值,然后获得原始速度 Y 的符号。我们需要标志来回滚。

    最后,发回修改后的velocityY。

    这是一个部分解决方案,因为如果用户一直按下滚动视图,速度不会改变。

    再次,请随时改进我的答案,我仍在学习。

    【讨论】:

    • MAX_SCROLL_SPEED 的价值是多少?
    【解决方案2】:
     ObjectAnimator anim = ObjectAnimator.ofInt(mScrollView, "scrollY", mScrollView.getBottom());                               
     anim.setDuration(9000);                     
     anim.start();
    

    【讨论】:

    • 它在scrollView的底部结束之前停止了。
    【解决方案3】:

    我认为使用计时器可以限制滚动速度。看这个链接Android: HorizontalScrollView smoothScroll animation time

    【讨论】:

      【解决方案4】:

      这就是我实现平滑垂直滚动的方式(如电影学分)。这也允许用户上下移动滚动,并允许在他们放手时继续滚动。在我的 XML 中,我将 TextView 封装在一个名为“scrollView1”的 ScrollView 中。尽情享受吧!

          final TextView tv=(TextView)findViewById(R.id.lyrics);
          final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView1);
          Button start = (Button) findViewById(R.id.button_start);
          Button stop = (Button) findViewById(R.id.button_stop);
          final Handler timerHandler = new Handler();
          final Runnable timerRunnable = new Runnable() {
              @Override
              public void run() {
                  scrollView.smoothScrollBy(0,5);         // 5 is how many pixels you want it to scroll vertically by
                  timerHandler.postDelayed(this, 10);     // 10 is how many milliseconds you want this thread to run
              }
          };
      
          start.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                 timerHandler.postDelayed(timerRunnable, 0);
              }
          });
      
          stop.setOnClickListener(new View.OnClickListener() {
      
              @Override
              public void onClick(View v) {
                  timerHandler.removeCallbacks(timerRunnable);
              }
          });
      

      【讨论】:

      • 你能告诉我在滚动到底部时如何停止可运行吗?请参阅link
      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      相关资源
      最近更新 更多