背景
最近在纯手写一个 slidingMenu,里面用到了 Scroller与computeScroll处理滑动,由于我也是第一次遇到这种东西,我这暴脾气,实在忍不住要记住一下,以供大家参考,更重要的是方便自己以后回忆
知识点讲解
实现滚动的方法
scrollTo(x,y)
作用:滑动到指定的坐标位置
参数一:指定位置的 X坐标
参数二:指定位置的 Y坐标
scrollBy(x,y)
作用:根据当前的坐标位置 滑动的相对距离
参数一:x方向 要滑动的相对距离
参数二:y方向 要滑动的相对距离
获取滚动距离的方法
getScrollX()
作用:获取 X方向 的滚动距离
getScrollY()
作用:获取 Y方向 的滚动距离
获取当前位置坐标(配合onTouchEvent(MotionEvent event)使用)
event.getX()
作用: 获取触发事件时刻的 X 坐标
event.getY()
作用: 获取触发事件时刻的 Y 坐标
前面这几个方法都仅仅是热身,下面我们的主角出场了
通过Scroller和computeScroll可以处理控件的平滑的过度到指定的最终位置。(其实你不用 Scroller,上面列举的方法已经够你实现滚动了,只是不平滑)
computeScroll可以参考Scroller计算结果来影响scrollTo,scrollBy,从而使得滑动发生改变。
Scroller.startScroll(int startX, int startY, int dx, int dy, int duration)
作用:平滑滚动
参数一:X 方向上的开始坐标
参数二:Y 方向上的开始坐标
参数三:X 方向上的偏移量(可正可负)
参数四:Y 方向上的偏移量(可正可负)
驱动过程:
1.Scroller.startScroll —> invalidate
2.invalidate —> onDraw —> draw —> computeScroll
3.Scroller.computeScrollOffset —> scrollTo —> invalidate
解释过程:
1.需要传入开始和结束的坐标Scroller.startScroll(int startX, int startY, int dx, int dy, int duration);或者是Scroller.startScroll(int startX, int startY, int dx, int dy, int duration);然后调用invalidate方法刷新。
2.invalidate方法会驱动draw方法,draw方法会驱动computeScroll方法。
3.在computeScroll方法内部需要判断是否已经滑动到Scroller指定的结束位置坐标(判断需要调用Scroller.computeScrollOffset,返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。),如果没有,则继续滑动,滑动需要调用scrollTo方法(或是scrollBy方法),scrollTo之后再调用invalidate方法。回到第二步循环,直至滑动到指定的结束位置坐标。
如果大家觉得这篇文章帮助你了,可以支持一下。
有偿提问