OverScroller、Scroll到edge时的阻尼效果,overScrollBy和scrollTo,AbsListView和ScrollView的滚动实现区别

OverScroller

和Scroller类似,都只是根据duration、已过去的时间,start position,final position,根据某种interpolator计算某个时刻的scrollX和scrollY(这里说的scrollX/Y和View的成员mScrollX/Y无关)。AbsListView和ScrollView添加阻尼效果使用的Scroller都是OverScroller,当然,还需其他类配合。

如果需要使用判断边界和绘制某种边界效果,使用View.overScrollBy()方法代替直接使用View.scrollTo()。而是否允许overScrollmode,则可由android:overScrollMode="true|false"来设定。

如果想要制造阻尼效果,可以参考ScrollView的实现,简单明了,AbsListView太复杂了。ScrollView使用computeScroll()驱动scroll过程的(AbsListView使用的其内部的FlingRunnable,通过不断postOnAnimation(Runnable)驱动scroll过程)。因为滚动计算和滚动变化AbsListView更复杂,所以夹杂在其中的阻尼效果代码的流程就不那么明朗,但是ListView也是使用了OverScroller,overScrollBy(),onOverScroll,EdgeEffect来实现阻尼效果的。

下面看看ScrollView#computeScroll():

    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            // This is called at drawing time by ViewGroup.  We don't want to
            // re-show the scrollbars at this point, which scrollTo will do,
            // so we replicate most of scrollTo here.
            //
            //         It's a little odd to call onScrollChanged from inside the drawing.
            //
            //         It is, except when you remember that computeScroll() is used to
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值