大家都知道OverScroll与Scroll类是实现弹性滑动的辅助滚动类,他们大部分api都一致,网上的资料大部分是介绍弹性Scroll的,对惯性滑动和回弹的解释很少,今天我们就来讲一讲。
讲惯性滑动前还是先讲一讲基础滑动吧
public void startScroll(int startX, int startY, int dx, int dy, int duration)
参数 | 说明 |
---|---|
startX | x轴起点坐标 |
startY | y轴起点坐标 |
dx | x轴滑动距离 |
dy | Y轴滑动距离 |
duration | 滑动时间,缺省250ms |
为什么要讲惯性滑动前先讲这个方法,因为------我喜欢,哈哈,开个玩笑~
上面的方法有3个已知条件,这对理解惯性滑动是帮助的,
1:滑动起点是已知的 startX and startY
2:滑动距离是已知的 dx and dy
3:滑动时间是已知的 duration
根据以上的条件可以计算出 滑动的终点坐标 startX + dx
滑动的速度,根据插值器和duration 共同决定,是实时变化的
在这里得提一下OverScroll中的3组方法
getStartX(); 滑动的起点x坐标 , 对应startX的值 这个值是恒定不变的
getStartY(); 滑动的起点y坐标 ,对应startY的值 这个值是恒定不变的
getFinalX(); 滑动的终点x坐标,值是OverScroll类计算的 startX + dx , 这个值是恒定不变的
getFinalY(); 滑动的终点y坐标,值是OverScroll类计算的 startY + dy, 这个值是恒定不变的
getCurrX(); 当前在x轴坐标,随着时间的推移最终等于终点坐标
getCurrY(); 当前在y轴坐标,随着时间的推移最终等于终点坐标
getCurrVelocity(); 当前滑动的速度
下面看看惯性滑动的方法
public void fling(int startX, int startY, int velocityX, int velocityY,
int minX, int maxX, int minY, int maxY)
参数 | 说明 |
---|---|
startX | x轴起点坐标 |
startY | y轴起点坐标 |
velocityX | x轴手指离开时的初始速度 |
velocityY | y轴手指离开时的初始速度 |
minX | x轴惯性滑动最短的滑动距离 |
maxX | x轴惯性滑动最长的滑动距离 |
minY | y轴惯性滑动最短的滑动距离 |
maxY | y轴惯性滑动最长的滑动距离 |
上面的方法已知条件 只有开始条件开始时的坐标 和 初始速度 ,滑动的终点坐标呢?怎么计算?,这其实不用担心,OverScroll已经帮我们计算好了,直接通过getFinalX(),getFinalY()就能获取到。
下面我们讲一讲minX 和 maxX
这里修改一下条件,假设初始速度为1km/h,其他条件不变,又能跑多远呢?答案是1km
minY或则minY这时候就能体现他的价值了,如果我们设置了minX或则minY 为10km,即使初始速度为1km/h,那么他最低的滑动距离也能达到10km,
下面我们在修改一下条件,假设初始速度为300km/h,其他条件不变,结果会怎样呢,如果初始速度达到400km/h?1000km/h?如果初始速度无限大,他也会无限的滑动下去,所以maxX 和maxY就能体现他的作用了。
设置了maxX 或则 maxY 即使速度无限大,也是有边界的,不会无限的滑行下去
惯性滑动大家理解了么?
系统也会给惯性滑动增加一个阻力
我们在举个例子,如果初始速度为大于100Km/h,max设置为100km,那么车在开到100km的地方就会突然停下,这是和我们的物理定律有冲突的,为了更自然,所以就有了回弹
public void fling(int startX, int startY, int velocityX, int velocityY,
int minX, int maxX, int minY, int maxY, int overX, int overY)
| overX | x轴回弹边界 |
| overY | y轴回弹边界 |
这里能看出比上一个函数多了两个参数,
我们设置overX = 20 ,maxX = 50, , 假设初始速度为60km/h,其他条件不变,那么,小车车能开到60km的位置,在回弹到50km的位置, 假设初始速度为80km/h,其他条件不变,那么,小车车能开到70km的位置,在回弹到50km的位置, 假设初始速度为40km/h,其他条件不变,那么,小车车能开到40km的位置,无回弹,不知道大家理解我上面的例子么,
总结如下:
maxX + overX 是能滑动到的最远距离,最后会回弹到maxX
如果未达到maxX ,则不用回弹