上篇博客我们聊了RN中关于Timing的动画,详情请参见于《
效果就是这么个效果,接下来,我们来看一下上述效果的具体代码实现,代码也不算太多,下方会把核心的代码拿出来聊聊。首先来看一下上述示例中用到的State。在State中有三个值,如下所示:
animationValue: 该值的类型为 Animated.ValueXY,ValueXY存放的是{x, y}的对象,其中这个x的值就是拖动后皮条拉伸后的X值,这个y值我们用来设置皮条的粗细度,也就是皮条的height。
mass: 然后就是这个mass(质量),我们用他来存放方块的质量的。
moveX: 该值用来存放手指移动时的X值的,用作在移动时实时更新皮条的拉伸度以及方块位置。

看完上述的State,接下来我们来看一下本Demo中涉及的手势操作。下方的这个 DisplayView 就是整个皮条以及方块所在的父View。下方是该View所涉及的手势操作:
onStartShouldSetResponder: 首先通过该属性开启手势相应者,在该属性接收到方法中返回true来打开响应者。
onResponderMove: 该属性所设置的方法就是是手指移动时所执行的回调,对应着iOS中的 touchMove 事件。通过该事件我们可以实时的拿到移动过程中的相关坐标。
onResponderRelease: 该属性所对应的方法会在手指离开屏幕时触发,我们可以在该事件中来打开 “皮条” 收缩的动画。
而下方截图中的这个 touchUp 事件就是手指离开屏幕时所触发的动作。在该事件中,我们更新了 State 中的moveX,我们使用的是pageX,也就是相对应页面的X值,这个MoveX我们设置的是方块的中心位置,根据具体的布局,我们需要做个 45 的纠正,这个纠正后的值就是方块要移动的地方。简单的说也就是手指移动的地方就是方块的中心点。设置完 MoveX 后,我们就开启了Spring动画,这个方块就会随着皮条的拉动往回走。
而这个 MoveView 方法就是随着手指的移动试试的更新State中的MoveX的值,而方块的位置就是根据这个State中MoveX的值决定的。
上述是我们本次动画中所涉及的几个事件,当然还有其他好多的手势事件,以后有机会可以在其他博客中详细的来介绍一下RN中常用的手势操作,关于手势在此就不做过多赘述了。

下方就是上述在 touchUp 方法中调用的启动Spring动画的相关方法,代码比较简单。就是设置了一下animation的目标值,及下方的animationValue, 以及设置了一下Spring动画的配置对象,即下方的config对象,其中的 mass 就是本示例中方块的质量。具体代码如下所示:

下方代码就是对应的就是红色方块的代码实现,在该代码中,我们为方块动态设置了 left。在手动滑动时,这个left的值随着手指移动的位置变化而变化,而当开始动画时,这个Left的值对应的就是 animationValue 中的x的值。具体如下所示:

关于本次这个 “拉皮条” 的示例的介绍就先到这儿,毕竟篇幅有限,下方是上述示例的完整代码:
“拉皮条”示例代码
二、“拉皮条” XS Max版本
Spring动画有好多属性,这些属性对应着弹簧的各个物理特性,下方这个Demo 是上述“拉皮条”的一个升级版本,通过该Demo,我们可以很好的来观察Spring动画中各个属性的作用,从而可以判断相关属性的各个使用场景。下方是“拉皮条” 的XS Max 版本。


备注:在上面第一个gif的最后有一个报错,下方是具体的报错内容,该错误的原因是我们设置的Spring的动画属性中冲突了。根据提示我们不难发现那些属性会冲突。我们可以根据错误提示把属性分为三组,(bounciness、speed ), (tenson、friction)以及(stiffness、damping、mass)如果设置了其中一个组的任何一个属性,那么其他两组中的属性都能再设置了,因为设置完后违反弹簧相关的物理定律,是不合规的,所以会报错。
You can define one of bounciness/speed, tenson/friction, or stiffness/damping/mass, but not more than one。

下方是该Demo中所涉及的属性:
1、friction - 摩擦力
“摩擦摩擦,在光滑的地板上摩擦……”,关于什么是摩擦力就不多说了,因为大家都知道穿着滑板鞋在光滑的地板上摩擦~摩擦~。该属性对应的就是滑块的摩擦力,根据物理常识摩擦力越大滑块被皮条拉伸的也就越慢,当摩擦力达到一定程度时,滑块就是匀速的运动了,而不是拉不动的情况,下方是具体的表现效果:

2、tension - 张力
"张力,物理学名词。物体受到拉力作用时,存在于其内部而垂直于两邻部分接触面上的相互牵引力。", 额~上面就是张力的解释,从物理字面量看,张力越大,方块被拉回的速度也就越快。下方这个Demo就能体现出这一点。从下方的图片中不难看出,随着张力的逐渐增大,这个方块被拉回的速度也就越快。
从上面的备注中我们可知,张力是可以和摩擦力一块设置的,所以下方我们设置tension的时候,也选中了friction。摩擦力大的话会使张力对滑块的作用力减小,这也是符合物理规律的。

3、bounciness - 抖
一个字儿概括就是“抖”,bounciness的值越大,这个滑块被拉回来是抖的就越厉害。下方就是这个“抖”的具体示例,从下方不难看出这个抖的值越大,方块回去时就越抖。

4、speed - 速度
速度及滑块被“皮条”拉回的速度, 当这个 speed 的值越大时,滑块就越容易被拉回,而且speed是可以和上面的“抖”bounciness一块设置的。下方就是Speed的相关效果。

5、stiffness - 刚度
刚度这个玩意儿也是个物理名词,刚度指材料或结构在受力时抵抗弹性变形的能力。通过这个解释我们不难看出,刚度越大,说明弹簧越不容易变形,越不容易变形的情况下,如果拉伸后就越快的恢复原形。对于这个刚度可以简单的理解为弹簧的刚度越好,那么这个弹簧的弹性就越好。下方就是刚度的表现:

6、damping - 阻尼
阻尼(damping) 的物理意义是力的衰减,或物体在运动中的能量耗散。通俗地讲,就是阻止物体继续运动。当物体受到外力作用而振动时,会产生一种使外力衰减的反力,称为阻尼力(或减震力) 。换句话说,阻尼就是“减震”,作用就是用来防止物体来回抖动的,这个与上面聊的那个“抖” -
