SpringAnimator实现联动效果
使用SpringAnimation实现弹簧联动
简介
弹簧效果动画SpringAnimation与甩动效果动画FlingAnimation使用上很类似,主要区别在于FlingAnimation是根据甩动动作fling提供的速度和摩擦力来控制动画,而SpringAnimation是根据弹簧的刚度、阻尼、目标终点三个因素来实现弹簧动画效果。所以对于弹簧动画,设置刚度Stiffness、阻尼DampingRatio、目标终点FinalPosition这三个参数就可以实现弹簧动画了,还有就是非必要因素速度Velocity。由于SpringAnimation的一些基本使用与FlingAnimation很相似,所以基本使用请参考《FlingAnimation的使用》这篇文章,本文只对重要的地方说明。先看效果如下。
对应项目地址:https://gitee.com/guaishoun/spring_animation.git
<image src="https://img.haomeiwen.com/i16667339/5f60471e97fc4da4.gif?imageMogr2/auto-orient/strip" width=40%>
添加库
def dynamicanimation_version = "1.0.0"
implementation "androidx.dynamicanimation:dynamicanimation:$dynamicanimation_version"
使用SpringForce设置弹簧效果
在基于弹簧特性的动画中,SpringForce
类允许您自定义弹簧的刚度、阻尼比以及最终位置,也可以添加一个速度。动画一开始,弹簧弹力便会更新每一帧的动画值和速度。动画会一直持续,直到弹簧弹力达到平衡状态。
更详细可以看AndroidDeveloper官网 弹簧动画。
阻尼比用于描述弹簧振动逐渐衰减的状况;
- 当阻尼比大于 1 时,会出现过阻尼现象。它会使对象快速地返回到静止位置。
- 当阻尼比等于 1 时,会出现临界阻尼现象。这会使对象在最短时间内返回到静止位置。
- 当阻尼比小于 1 时,会出现欠阻尼现象。这会使对象多次经过并越过静止位置,然后逐渐到达静止位置。
- 当阻尼比等于零时,便会出现无阻尼现象。这会使对象永远振动下去。
常用阻尼有
-
DAMPING_RATIO_HIGH_BOUNCY
-
DAMPING_RATIO_MEDIUM_BOUNCY
-
DAMPING_RATIO_LOW_BOUNCY
-
DAMPING_RATIO_NO_BOUNCY
刚度定义了用于衡量弹簧强度的弹簧常量。常用刚度有
STIFFNESS_HIGH
STIFFNESS_MEDIUM
STIFFNESS_LOW
STIFFNESS_VERY_LOW
给动画设置弹簧属性时,要知道弹簧属性SpringForce是弹簧动画SpringAnimation的一个属性,所以可以new 也可以使用默认的get
final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);
//new and set
SpringForce force = new SpringForce();
force.setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY);
force.setStiffness(SpringForce.STIFFNESS_LOW);
anim.setSpring(force);
//或者getDefault and set
…
//Setting the damping ratio to create a low bouncing effect.
anim.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY);
//Setting the spring with a low stiffness.
anim.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);
最终位置虽然也属于SpringForce的一个属性,但是使用SpringAnimation来设置即可
new SpringForce(finalPosition)
//构造函数
public <K> SpringAnimation(K object, FloatPropertyCompat<K> property,
float finalPosition)
springAnimation.animateToFinalPosition(float finalPosition)
速度设置速度是为了添加在甩动后给弹簧动画添加初始速度,使动画更符合实际惯性运动效果。
springAnimation.setStartVelocity(velocityX);
总结
SpringAnimation的使用要紧扣阻尼比、刚度、最终位置,这三点即可,而速度可有可无。与FlingAnimation的使用没有多大区别。但是SpringAnimation可以使界面更有质感。