降低滚动视图中平滑滚动的速度[重复]

Posted

技术标签:

【中文标题】降低滚动视图中平滑滚动的速度[重复]【英文标题】:Reduce speed of smooth scroll in scroll view [duplicate] 【发布时间】:2012-01-28 09:14:21 【问题描述】:

我有一个滚动视图。我使用 smoothScrollBy() 执行了平滑滚动。一切正常,但我想更改平滑滚动的持续时间。平滑滚动发生得非常快,用户不明白发生了什么。请帮我降低平滑滚动速度?

【问题讨论】:

【参考方案1】:

简单的答案就是替换

scrollView.smoothScrollTo(0, scrollTo);

ObjectAnimator.ofInt(scrollView, "scrollY",  scrollTo).setDuration(duration).start();

duration 是您希望花费的时间(以毫秒为单位)。

【讨论】:

这绝对是最好的答案,非常好。 什么是 ObjectAnimator?这段代码应该在哪里调用? 这绝对有效。但就我的情况而言,我触发了 smoothScroll onTouch ACTION_UP,它有点马车,轻弹。 很棒的 xd 简单漂亮——应该是正确答案。【参考方案2】:

试试下面的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)

    ValueAnimator realSmoothScrollAnimation = 
        ValueAnimator.ofInt(parentScrollView.getScrollY(), targetScrollY);
    realSmoothScrollAnimation.setDuration(500);
    realSmoothScrollAnimation.addUpdateListener(new AnimatorUpdateListener()
    
        @Override
        public void onAnimationUpdate(ValueAnimator animation)
        
            int scrollTo = (Integer) animation.getAnimatedValue();
            parentScrollView.scrollTo(0, scrollTo);
        
    );

    realSmoothScrollAnimation.start();

else

    parentScrollView.smoothScrollTo(0, targetScrollY);

【讨论】:

这应该被选作问题的答案。 +1 不使用ValueAnimator,为什么不使用ObjectAnimator(ValueAnimator的子类)呢?它使它变得更加容易-实际上是一个衬里: ObjectAnimator.ofInt(scrollView, "scrollY", targetScrollY).setDuration(500).start();【参考方案3】:

这就是我实现平滑垂直滚动的方式(如电影学分)。这也允许用户上下移动滚动,并允许在他们放手时继续滚动。在我的 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);
        
    );

【讨论】:

我怎么知道滚动到底部并且必须关闭runnable?如何处理?【参考方案4】:
whichScreen = Math.max(0, Math.min(whichScreen, getBase().getDocumentModel().getPageCount()-1));
mNextScreen = whichScreen;
final int newX = whichScreen * getWidth();
final int delta = newX - getScrollX();
//scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta));
invalidate();

【讨论】:

以上是关于降低滚动视图中平滑滚动的速度[重复]的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView - 如何平滑滚动到嵌套滚动视图内某个位置的项目顶部?

ios - 使 UIScrollView 平滑滚动

在具有多个部分的 tableView 中滚动时使用平滑动画更改视图背景渐变颜色

NestedScrollView 平滑滚动到顶部和内部的视图

使用 url 图像平滑滚动的表格视图

iOS:用于平滑滚动和轻弹视图的手势识别器