滚动视图的方法有两种:scrollTo和scrollBy,而Scroller就是它们的辅助工具类,所以Scroller是学好高级UI必不可少的一课。
(1)scrollTo、scrollBy、getScrollX、getScrollY
view的内容本身具备滚动的方法,其中滚动方法如下:
scrollTo:相对于初始位置移动
scrollBy:相对于上次移动的最后位置移动
这两个方法特别需要注意以下几点:
两者移动的都是view的内容,view本身是不移动的,所以getX和getY的值不会受到这两个方法的影响;
不要再在onDraw中调用这两个方法,避免onDraw方法被重复执行,因为一旦调用这两个方法view会被重绘,onDraw方法会再次执行。
view内容滚动的方法有了,那么该如何获取view内容被滚动的距离呢?看以下两个方法:
getScrollX:获取view的内容在X轴滚动的距离
getScrollY:获取view的内容在Y轴滚动的距离
以上只说到view内容的滚动,那么view本身的移动用什么方法呢?
答:setX和setY方法。
本文的重点内容是Scroller,这个辅助类的作用不是view本身的移动,而是view内容的滚动,下面开始简单说明一下Scroller辅助类。
(2)熟悉Scroller的构造方法
//默认插值器是ViscousFluidInterpolator
Scroller mScroller = new Scroller(mContext);
//指定一个插值器
Scroller mScroller = new Scroller(mContext, new AccelerateDecelerateInterpolator());
//指定一个插值器,第三个参数表示是否开启“飞轮”效果,也就是多次滚动时速度叠加
Scroller mScroller = new Scroller(mContext, new AccelerateDecelerateInterpolator(), false);
(3)熟悉插值器
图片.png
Scroller其实就是在scrollTo(x, y)和scrollBy(x, y)的基础上添加滚动效果,滚动效果是一个动画,当我们new一个Scroller对象时,就已经指定了一个插值器,下面来说明一下各种插值器:
ViscousFluidInterpolator:这是一个默认插值器,当构造Scroller时,如果不传递插值器或者插值器为null时,系统默认使用ViscousFluidInterpolator插值器。
AccelerateDecelerateInterpolator:在动画开始与结束的时候速率改变比较慢,在中间的时候速率较快。
AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始加速。
AnticipateInterpolator:开始的时候向后然后向前甩。
AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值。
BounceInterpolator:反弹插值器。
CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线。
DecelerateInterpolator:在动画开始的地方快然后慢。
LinearInterpolator:以常量速率改变。
OvershootInterpolator:向前甩一定值后再回到原来位置。
PathInterpolator:路径插值器,我们可以按照自己想要的轨迹滚动。
PathInterpolator(Path path)
PathInterpolator(float controlX, float controlY)
PathInterpolator(float controlX1, float controlY1, float controlX2, float controlY2)
FastOutLinearInInterpolator:MaterialDesign基于贝塞尔曲线的插补器效果:依次慢慢快。
FastOu