View的事件体系之--View的弹性滑动Scroller



           上一篇说了View的几种滑动方式,但是哪几种方式滑动起来都比较生硬,没有弹性,这里介绍一种弹性滑动--Scroller。他的原理实际上就是:把一次大的滑动分成若干个小的滑动(而且这些每一次的小滑动并不是平均的,而是根据时间的流逝而起变化)


       

Scroller  mScroller = new Scroller(context); 
   
    //调用此方法渐进性滚动到目标位置  
    public void smoothScrollTo(int fx, int fy) {  
        int dx = fx - mScroller.getFinalX();  
        int dy = fy - mScroller.getFinalY();  
        
        //开始滚动
        //但是实际上这个startScroll()内部并没有做和滑动相关的事,真正实现滑动的是下面的invalidate(),我们都知道这个函数是用来重绘界面的,它里面会调用到
        //computeScroll(),所以就在 computeScroll()方法里实现小滑动,并且循环,直至实现大滑动
        mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);  

        invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果  
        
 
    }  

//调用invalidate()重绘的时候里面会调用到这个方法
@Override  
    public void computeScroll() {  
      
        //先判断大滑动mScroller滚动是否完成  
        if (mScroller.computeScrollOffset()) {  
          
            //这里调用View的scrollTo()完成实际的滚动(一次小滑动)  
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());  //这个CurrX,CurrY是在computeScrollOffset()计算的,即每一次的小滑动大小,它里面是随时间流逝变化的
              
            //重绘 
            postInvalidate();  
        }  
        super.computeScroll();  
    }  
}  

可以看到Scroller实现弹性滑动的内部实现每一次的小滑动也是利用scrollTo()去完成的,所以Scroller实现渐进性滑动的原理正如开头所说的:把一次大的滑动分成若干个小的滑动(而且这些每一次的小滑动并不是平均的,而是根据时间的流逝而起变化)


当然实现渐进性滑动并不是只有利用Scroller这一种方式,除此之外,我们还可以使用延时策略来达到目的,即设定每隔一小段时间来一次小滑动,最终完成一次大滑动,但是本质的原理都一样,就是化大滑动为小滑动,这样从视觉上就感觉滑动十分的平缓好看了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值