Scroller相关

scrollTo/scrollBy

  • 这两个方法都是View的内部方法
  • scrollTo和scrollBy只能改变View的内容而不能改变View在布局中的位置。
  • 移动方向与笛卡尔坐标轴左右上下是相反的
  • 在滑动过程中,View内部的两个属性mscrollX和mscrollY都可以通过getScrollX和getScrollY方法获得,mscrollX就是View左边缘和View内容左边缘在水平方向的距离。同理,mscrollY就是View上边缘和View内容的上边缘的竖直方向的距离

Scroller

  • Scroller就是一个辅助类, 用来帮助进行弹性滑动。具体使用方法如下:
//在需要改动的view中
Scroller scroller = new Scroller(mContext);

//缓慢滚动到指定位置
private void smoothScrollTo(int destX, int destY){
      int scrollX = getScrollX();       //获取当前的mscrollX
      int scrolloY = getScrollY();     //获取当前的mscrollY
      int deltaX = destX - scrollX;
      int deltaY = destY - scrollY;
      mScroller.startScroll(scrollX, scrollY , deltaX, deltaY,1000);
      invalidate();
}


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

上面的代码就是如何在自定义的View中添加弹性滑动的效果。在自定义的View初始化时,定义一个Scroller,然后自己添加一个private void smoothScrollTo()这样一个私有方法,用来被调用来执行滑动效果的。public void computeScroll()方法在view中本是一个空实现的方法,这个方法在view重绘时,draw方法中会被调用。那上面的代码整个逻辑流程是什么呢?让我们继续往下看。

  • Scroller的源码学习
    smoothScrollTo(int destX, int destY)方法中,整个逻辑流程如下:
  1. 我们首先利用view的getScrollX方法和getScrollY方法获取到现在view与其内容的偏移距离,
  2. 接着根据目标偏移距离和当前偏移距离的差值,得到这次目前需要进行得分位移
  3. 执行mScroller.startScroll()方法,输入参数是当前X,Y方向的偏移距离,目标的偏移距离,位移时间。下面介绍下mScroller.startScroll()方法的源码。主要功能是保存传递的几个参数。
public void startScroll(int startX, int startY,int dx,int dy,int duration){
     mMode = SCROLL_MODE;
     mFinished = false;
     mDurarion = duration;
     mStartTime = AnimationUtilesd.currentAnimationTimeMilllis();
     mStartX = startX;
     mStartY = startY;
     mFinalX = startX + dx;
     mFinalY = startY  + dy;
     mDeltaX = dx;
     mDeltaY = dy;
     mDurationReciprocal = 1.0f /(float) mDuration; 
}
  1. 调用invalidate()会导致该View重绘,View在draw()方法中会调用computeScroll()方法。
  2. computeScroll()方法,先调用mScroller.computeScrollOffset()方法,并判断其返回值。该方法的主要功能就是根据开始的坐标位移,目的坐标位移,当前的时间,总时间来确定此时此刻的位移X Y应该是多少,并赋给mCurrX和mCurrY。
    public boolean computeScrollOffset(){
          ...
          int timePassed = (int) (AnimationUtils.currentAnimationTimeMills() - mStartTime);
          
          if (timePassed < mDuration) {
                switch(mMode) {
                case SCROLL_MODE:
                      final float x = mInterpolartor.getInterpolation(timePassed * mDurationReciprocal);
                      mCurrX = mStartX + Math.round(x * mDeltaX);
                      mCurrY = mStartY + Math.round(x * mDeltaY);
                      break;
                      ......
                }
          }
          return true;         
    }
    
  3. computeScrollOffset()执行完后,在computeScroll方法中,使用scrollTo方法位移到刚刚计算出的mCurrX,mCurrY的位置上,然后调用postInvalidate()方法,再次要求重绘,再次调用draw方法,从而再次执行computeScroll( )方法让,从而能够绘制出不同时间在不同位置出现的移动画面。
    scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
    postInvalidate();
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出。 当了解了Android坐标系和触...
    Blankj阅读 6,639评论 3 61
  • 一、Android开发初体验 二、Android与MVC设计模式模型对象存储着应用的数据和业务逻辑。模型类通常用来...
    为梦想战斗阅读 885评论 0 3
  • 什么是View View 是 Android 中所有控件的基类。 View的位置参数 View 的位置由它的四个顶...
    acc8226阅读 1,166评论 0 7
  • 预备知识 Android屏幕区域划分我们先看一副图来了解一下Android屏幕的区域划分,如下:Android屏幕...
    小芸论阅读 8,950评论 6 44
  • 你身影如飞天蓦然跃出时光的水面仰望,你如皓月临空凝眸,你如星辰初绽你的色泽滋润我目光如玉你的弧度拨动我心绪如弦聆听...
    伊甸陨石阅读 278评论 0 1