滚动视图的速度限制

时间:2012-04-30 15:18:25

标签: android android-layout

我的应用滚动超级快! 如何在我的Android应用程序中限制滚动视图的滚动速度? 滚动速度非常快,滚动速度毫无意义。

4 个答案:

答案 0 :(得分:11)

这个帖子很旧,但我会回答一个部分解决方案:限制飞行速度。随意评论,以便我可以改进我的解决方案。

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

  

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和原始velocityY之间的最小值,然后获得原始velocityY的符号。我们需要标志向后滚动。

最后,发回修改后的velocityY。

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

再次,随时提高我的答案,我还在学习。

答案 1 :(得分:2)

 ObjectAnimator anim = ObjectAnimator.ofInt(mScrollView, "scrollY", mScrollView.getBottom());                               
 anim.setDuration(9000);                     
 anim.start();

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这就是我如何实现平滑的垂直滚动(就像电影信用)。这也允许用户上下移动滚动并允许它在松开时继续滚动。在我的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);
        }
    });