Scroller
是什么:
Scroller
是一个用来辅助View
滚动的工具类。它本身并不能够控制 View 的滚动,它只是用来辅助滚动的。
小明:什么意思,我自己就可以让 View 滚动啊,为什么还要它来辅助我?
老师问小明:在一个 ViewGroup 中把 A 点的一个 View 拉到 B 点,松手之后怎么让这个 View 再回到 A 点呢?奥,不对,是平滑的滚动到 A 点。
小明想了想:可以使用动画!
老师:除了动画还有什么办法呢?
小明:不知道了。
老师:(嘻嘻)可以用 Scroller。
这里为什么强调松手之后,这就可以解释 Scroller 是用来辅助 View 做滚动,而不是使用它来让 View 滚动。比方说我们触摸一个 View,松手之前,我们可以在onTouchEvent
里用scrollTo
或scrollBy
来控制 View 的滚动,当松手之后就可以使用 Scroller 的 startScroll
方法,设置 View 的X轴和Y轴方向上的偏移坐标(这个偏移坐标以 View 的左上方在父控件的坐标系中为准)以及对应方向上想要滚动的距离。
PS:scrollTo
和scrollBy
都可以滚动 View 中的内容!View 中的内容!View 中的内容!不是滚动 View 自身。但是两者又有区别,看源码:
|
|
|
|
scrollTo 中直接将传入的新的X轴和Y轴的偏移坐标与当前的偏移坐标比较,如果不同,则直接赋值给了mScrollX
和mScrollY
,所以调用多次scrollTo
只会发生一次位置的变化,而调用多次 scrollBy
则会改变多次,每一次以上一次的偏移坐标为基准。
小明:老师你bb半天,到底怎么样能滚动啊?
老师:自定义 ViewGroup 重写computeScroll
方法,在computeScroll
中实现滚动。computeScroll
是 View 类中的方法,这个方法是空的,并没有任何实现。这个方法是干什么的呢?字面意思就是计算滚动。我们看看源码:
|
|
注释意思大概是:如果需要的话,父控件会调用这个方法来请求子控件更新mScrollX和mScrollY的值,如果子控件是使用 Scroller 来执行动画滚动,通常会这样做。
那我们就可以在这个方法里这样写:
|
|
计算滚动偏移量,获取最新的偏移坐标并设置到scrollTo
中,以此实现滚动效果。
|
|
computeScrollOffset
:当你想获取新的坐标点,你就可以调用它更新坐标点,然后调用getCurrX
或getCurrY
来获取最新的坐标点。如果返回true
表示这个滚动动画还没有完成。
用法比较简单,下面使用 Scroller 实现一个 Demo:
|
|