Scroller与computeScroll处理滑动

背景

最近在纯手写一个 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方法。回到第二步循环,直至滑动到指定的结束位置坐标。

 

如果大家觉得这篇文章帮助你了,可以支持一下。

有偿提问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值