使用Scroller实现View的弹性滑动

本文介绍如何通过Scroller实现Android中View的平滑滚动效果。Scroller结合View的computeScroll方法,能够使View组件产生平缓的滚动动画。文章详细解释了Scroller的工作原理及其在代码中的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

View有scrollTo、scrollBy方法,但是滑动是瞬时的,比较僵硬。可以通过Scroller来实现View的弹性滑动。


ScrollView就有smoothScrollTo和smoothScrollBy方法,这两个方法实现的就是弹性滑动的效果,它们内部实际也是用了Scroller。


Scroller的典型使用方法:

private Scroller mScroller = new Scroller(getContext());

    private void smoothScrollTo(int destX, int destY, int scrollTime){
        mScroller.startScroll(getScrollX(), getScrollY(), destX - getScrollX(), destY - getScrollY(), scrollTime);
        invalidate();
    }

    @Override
    public void computeScroll() {
        if(mScroller.computeScrollOffset()){
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
        }
    }

上述代码就能实现慢慢滑动的弹性效果,为什么呢?

从源码看,startScroll这个方法内部其实什么也没有做,只是保存了传递的参数:


invalidate方法会使view重绘,view的draw方法会去调用computeScroll方法,我们复写了这个方法,在里面调用了computeScrollOffset,这个函数的意义是根据当前时间的流逝计算出当前的scrollX和scrollY应该是多少(根据之前startScroll所传入的时间),如果这个方法返回true,证明滑动还没有结束。所以只要判断还在滑动,就调用scrollTo,滑动到当前的scrollX和scrollY的位置,然后再调用postInvalidate,又会使得view重绘,然后再次调用computeScroll方法,直到computeScrollOffset返回false滑动结束。


因此,Scroller本身其实并不能使view滑动,还需配合view的computeScroll方法才能实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值