OverScroll(惯性滑动和回弹边界的详解)

OverScroll与Scroll

大家都知道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

这里我们假设有一辆车的初始速度50km/h,假设风的阻力为每一公里速度降低1 ,让他自然停下能跑多少公里?答案大家都知道吧50km。

这里修改一下条件,假设初始速度为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 ,则不用回弹

你可能感兴趣的:(Android)