Android Scroller源码分析

弹性滑动

在看Scroller的使用方法之前我们需要先了解一下View的scrollTo和scrollTo方法,

public void scrollTo(int x,int y){
      //如果当前偏移量变化
      if(mScrollX!=x||mScrollY!=y){
              int oldX=mScrollX;
              int oldY=mScrollY();
               //赋值偏移量
              mScrollX=x;
              mScrollY=y;
              invalidateParentCaches();
              //回调onScrollChanged方法
              onScrollChanged(mScrollX,mScrollY,oldX,oldY);
              if(!awakenScrollBars()){
                    postInvalidateOnAnimation();             
              }            
      }
}

scrollTo()是指将前视图内容横向偏移x距离,纵向偏移y距离。注意这里是View的内容的偏移,而不是View本身。而scrollBy()方法如下:

public void scrollBy(int x,int y){
        scrollTo(mScrollX+x,mScrollY+y); 
}

scrollBy()方法里直接调用了scrollTo()方法,表示在当前偏移量的基础上继续偏移(x,y)。

使用Scroller开始

Scroller scroller=new Scroller(mContext);
//缓慢滚动到指定位置
private void smoothScrollTo(int destX,int destY){
      int scrollX=getScrollX();
      int deltaX=destX-scrollX;
      //1000ms内滑动destX,效果就是慢慢移动
      mScroller.startScroll(scrollX,0,detaX,0,1000);\
      //invalidate方法会导致View的重绘,在View的draw方法中又会去调用computeScroll方法
      //invalidate-draw-computeScroll
      invalidate();
}
@Override
public void computeScroll(){
      if(mScroller.computeScrollOffset()){
              scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
              //view第二次重绘
              postInvalidate();
      }
}

上面是Scroller典型的使用方法,当我们构造一个Scroller对象时并且调用它的startScroll方法时,Scroller内部其实什么也不做,它只是保存了我们传入的几个参数,这几个参数从startScroll的原型上就可以看出来

public void startScroll(int startX, int startY, int dx, int dy, int duration) {
  // mMode 分两种方式 1.滑动:SCROLL_MODE 2. **加速度滑动:FLING_MODE**
  mMode = SCROLL_MODE;
  // 是否滑动结束 这里是开始所以设置为false
  mFinished = false;
  // 滑动的时间
  mDuration = duration;
  // 开始的时间
  mStartTime = AnimationUtils.currentAnimationTimeMillis();
  // 开始滑动点的X坐标
  mStartX = startX;
  // 开始滑动点的Y坐标
  mStartY = startY;
  // 最终滑动到位置的X坐标
  mFinalX = startX + dx;
  // 最终滑动到位置的Y坐标
  mFinalY = startY + dy;
  // X方向上滑动的偏移量
  mDeltaX = dx;
  // Y方向上滑动的偏移量
  mDeltaY = dy;
  // 持续时间的倒数 最终用来计算得到插值器返回的值
  mDurationReciprocal = 1.0f / (float) mDuration;
}

1.startScroll(int startX, int startY, int dx, int dy, int duration):

通过起始点、偏移的距离和滑动的时间来开始滑动。

  • startX 起始滑动点的X坐标
  • startY 起始滑动点的Y坐标
  • dx 滑动的水平偏移量。>0 则表示往左滑动。
  • dy 滑动的垂直偏移量。>0 则表示往上滑动。
  • duration 滑动执行的时间

startX和startY表示的是滑动的起点,dx与dy表示的是滑动的距离,而duration表示的是滑动的时间,即整个滑动过程完成所需要的时间,这里的滑动是指View的内容(content)的滑动,而非View本身位置的滑动。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出。 当了解了Android坐标系和触...
    Blankj阅读 11,710评论 3 60
  • 本文分析版本: Android API 22 1.简介 Android开发中,如果我们希望使一个View滑动的话,...
    SkyKai阅读 6,882评论 2 24
  • 预备知识 Android屏幕区域划分我们先看一副图来了解一下Android屏幕的区域划分,如下:Android屏幕...
    小芸论阅读 12,906评论 6 44
  • 这下子,就只能一心一意了!但,是不是还需要一个额外的东西作为自身的筹码,要怎么做,应该就需要认真想想了!
    聂一一阅读 1,058评论 0 0
  • 她出生在一个落后的鲁西山村,不对,那儿穷的连山都没有,而且她是不是鲁西的也不好说,她更不知道自己的父母是谁,因为她...
    小李非刀阅读 5,030评论 4 2

友情链接更多精彩内容