Scroller简介

Scroller简介

SlidingMenu项目中为了实现控件的滑动,需要用到Scroller类来实现缓慢的滑动过程,至于有人说View类可以直接调用scrollTo()方法, 这里scrollTo()方法也能实现移动,但是它的移动是很快一下子就移过去了,就像穿越一样,直接从现实回到了过去,而Scroller类能够实现过程的移动。 可以理解为一步步的走。

  1. 查看Scroller源码 public class Scroller { //... } 发现Scroller类并不是View的子类,只是一个普通的类,这个类中封装了滚动的操作,记录了滚动的位置以及时间等。 该类有两个重要的方法:
    • computeScrollOffset(): 文档的说明为Call this when you want to know the new location.查看源码可以发现,如果在移动到指定位置后就会返回false.正在移动的过程中返回true。
    • startScroll(): 该方法的内部实现,并没有具体的移动方法,而是设置了一些移动所需的数据,包括移动持续的时间、开始位置、结束位置等。从而我们可以知道调用Scroller.startScroll()方法并没有真正的移动,而是设置了一些数据。
  2. Scroller.startScoll()是如何与View的移动相关联呢?在View的源码中: /** * Called by a parent to request that a child update its values for mScrollX * and mScrollY if necessary. This will typically be done if the child is * animating a scroll using a {@link android.widget.Scroller Scroller} * object. */ public void computeScroll() { } 通过注释我们可以看到该方法又父类调用根据滚动的值去更新View,在使用Scroller的时候通常都要实现该方法。来达到子View的滚动效果。 继续往下跟发现在draw()方法中回去调用computeScroll(),而draw()方法会在父布局调用drawChild()的时候使用。
  3. 具体关联 通过上面两步大体能得到ScrollerView的移动要通过computeScroll()来完成,但是在究竟如何进行代码实现。 Scroller.startScroll()方法被调用后会储存要滚动的起始位置、结束位置、持续时间。所以我们可以在computeScroll()方法中去判断一下当前是否已经滚动完成,如果没有滚动完成, 我们就去不断的获取当前Scroller的位置,根据这个位置,来把相应的View移动到这里。 public void computeScroll() { if (mScroller.computeScrollOffset()) { //如果还没有滚动完成,我们就去让当前的View移动到指定位置去 mCenterView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); //移动完后,我们应该继续调用computeScoll方法去获取并且移动当前View。所以我们调用invalidate方法去请求重绘,这样父类就会调用computeScroll postInvalidate(); } }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ytkah

{dede:list}和{dede:arclist}的区别

1.{dede:list}是用于列表页的文章列表调用,通常是用于list_article.htm页面,这个文章列表是可以分页的。 功能说明:表示列表模板里的分...

37460
来自专栏吴裕超

认识createDocumentFragment

今天在看vue源码解析时候发现一个api没有见过,一查是原生的,赶紧补漏。 DocumentFragments 是DOM节点。它们不是主DOM树的一部分。通常的...

27770
来自专栏Google Dart

AngularDart 4.0 高级-结构指令 顶

本指南介绍Angular如何用结构指令操纵DOM,以及如何编写自己的结构指令来完成相同的操作。

15020
来自专栏老脸一黑

go 并发处理脚本

最近经常涉及到脚本的编写。本身项目数据量较大,所以经常编写的脚本需要高并发,干脆就提取出来。

550260
来自专栏web前端-

rem和em小插曲

1.对em来说,它的大小是相对于父层font-size来改变,但是如果其自身有font-size属性的话,em会优先考虑自身的font-size;

10120
来自专栏coder修行路

Go基础--终端操作和文件操作

终端操作 操作终端相关的文件句柄常量 os.Stdin:标准输入 os.Stdout:标准输出 os.Stderr:标准错误输出 关于终端操作的代码例子: pa...

30860
来自专栏潇涧技术专栏

Dive into Android Custom View

下面的内容我将结合一个简单的自定义View的例子解释下我们可以如何让自定义View做得更好,这里的自定义View的例子是类似即刻应用中点赞时数字变换效果,代码地...

12830
来自专栏柠檬先生

Angularjs基础(十一)

ng-csp       描述:修改内容的安全策略       实例: 修改AngularJS 中关于"eval"的行为方式及内联样式;         ...

27750
来自专栏老九学堂

【干货】20K以上的高薪Java必掌握的基础知识点(二)

怎么样!上一期的知识点小伙伴都掌握了多少呢?复习的同时有没有查漏补缺的巩固自己的基础知识呢?今天我们来复习Java基础知识第二期! 61、Math 类提供了许多...

38970
来自专栏十月梦想

Vue.set方法(响应数据和视图层)

前面一篇说过直接修改数据vue是检测不到的,所以视图层和数据层不能保持同步!那么vue是否提供了保持响应的方法,答案肯定是有的!

20530

扫码关注云+社区

领取腾讯云代金券