Android O 出来了,带来了一种全新的动画 Physics-based Animation
先上Demo地址:https://github.com/lyric315/SpringAnimationTest
效果图:
概述
Physics-based Animation依赖于物理规律,在动画中表现出高度的现实感。 在我们的日常生活中,当一个变化发生时,我们会自然而然的意识到它会伴随着一段物理的变化过程。 同样地,我们很容易觉察到更自然、不间断以及保持动力的动画。
How does Physics-based Animation work?
Physics-based Animation使用物理学的基础来构建动画。 一个动画是用力来驱动的。 当力达到平衡时,动画就会休息。 新的动画API融入了物理学规律,以呈现更自然和灵活的动画。
优点
Android提供的其他动画由固定的时间间隔和变化的动画值驱动。 在运行过程中改变动画而不引入任何视觉破坏是非常具有挑战性的。
通过 Physics-based Animation ,动画可以跟踪速度,完美地校正方向,以及自然地移动到新的位置。 动画通过保持速度持续保持动力,从而使得从一个值平滑过渡到另一个值。
- 自然的
- 动画更灵活,模仿实时移动。
- 矫正方向
- 动画在目标变化时保持动力,以更平稳的结束动画。
- 减少视觉冲击
- 动画显示更加敏感和平滑,并减少整体的视觉中断。
对比(Animator-based animation VS physics-based animation)
Animator-based animation是相当静态的,并且具有固定的持续时间。 为了适应目标值的变化,您需要在目标值更改时取消动画,将当前值的动画重新配置为新的起始值,并添加新的目标值。 在视觉上,这个过程会造成动画的突然中断以及不连贯的动作。
Physics-based animationI构建的动画由自然力来驱动。 力的变化导致目标值的变化。 新的力作用于现有的速度,它会连续过渡到新的目标。 这个过程导致一个更自然的动画。
下图显示了Animator-based animation和physics-based animation之间的区别。 图1中的动画是使用ObjectAnimator 。 图2中的动画是physics-based animation构建的。
添加支持库
在应用程序项目中添加Physics-based Animation支持库:
dependencies {
...
compile "com.android.support:support-dynamic-animation:26.0.0-beta1"
}
官方文档:https://developer.android.com/preview/features/physics-based-animation.html
Spring Animation 弹性动画
Spring Animation弹性动画模仿弹簧的变化过程,基于施加在每个对象上的弹性力来计算值和速度。
在弹性动画中, SpringForce类允许您定制弹性的刚度、阻尼比和最终位置。 一旦动画开始,弹性力就会更新动画值和每帧的速度。 动画持续到弹性力达到平衡。
例如,如果您在屏幕上拖动应用程序图标,然后松手,则图标将通过隐形但熟悉的力量拖动到原始位置。
创建弹簧动画
主要步骤是创建SpringAnimation类的一个实例并设置运动行为参数。SpringAnimation类允许您为对象创建弹簧动画。 要创建一个弹簧动画,您需要创建一个SpringAnimation类的实例,并提供一个动画属性,以及一个可选的最终弹簧位置。
例子:
final View img = findViewById(R.id.imageView);
// 动画属性:translationY property; spring position at 0.
final SpringAnimation springAnim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y, 0);
弹性动画支持以下View属性:
- ALPHA :表示视图中的Alpha透明度。 默认值为1(不透明),值为0表示完全透明(不可见)。
- TRANSLATION属性:TRANSLATION_X , TRANSLATION_Y和TRANSLATION_Z
- ROTATION , ROTATION_X和ROTATION_Y :这些属性控制旋转点在2D( rotation属性)和3D周围旋转。
- SCROLL_X和SCROLL_Y :这些属性指示源左侧和顶部边缘的滚动偏移(以像素为单位)。 它也表示了页面滚动的位置。
- SCALE_X和SCALE_Y
- X , Y和Z :这些是用于描述视图在其容器中的最终位置的基本实用程序属性。
注册动画监听器
DynamicAnimation类提供了两个监听器: OnAnimationUpdateListener和OnAnimationEndListener 。
OnAnimationUpdateListener
当您想要创建多个视图以及创建链式动画时,您可以设置OnAnimationUpdateListener,在当前视图的属性发生更改时回调。 回调通知另一个视图,以根据当前视图的属性中发生的更改来更新其弹出位置。
例子:
// Creating two views to demonstrate the registration of the update listener.
final View view1 = findViewById(R.id.view1);
final View view2 = findViewById(R.id.view2);
//view1和view2设置弹簧动画 (translationX和translationY属性)
final SpringAnimation anim1X = new SpringAnimation(view1,
DynamicAnimation.TRANSLATION_X);
final SpringAnimation anim1Y = new SpringAnimation(view1,
DynamicAnimation.TRANSLATION_Y);
final SpringAnimation anim2X = new SpringAnimation(view2,
DynamicAnimation.TRANSLATION_X);
final SpringAnimation anim2Y = new SpringAnimation(view2,
DynamicAnimation.TRANSLATION_Y);
// 注册监听器
anim1X.addUpdateListener(new DynamicAnimation.OnAnimationUpdateListener() {
// view1属性发生更改。
@Override
public void onAnimationUpdate(DynamicAnimation dynamicAnimation, float value,
float velocity) {
anim2X.animateToFinalPosition(value);
}
});
anim1Y.addUpdateListener(new DynamicAnimation.OnAnimationUpdateListener() {
@Override
public void onAnimationUpdate(DynamicAnimation dynamicAnimation, float value,
float velocity) {
anim2Y.animateToFinalPosition(value);
}
});
OnAnimationEndListener
OnAnimationEndListener 允许你去监听动画的结束,当动画达到均衡或取消时,接收回调。 要注册监听器,请执行以下步骤:
- 调用addEndListener()方法并将监听器附加到动画。
- 覆盖onAnimationEnd()方法,以便每当动画达到均衡或被取消时接收通知。
设置弹簧属性
SpringForce类为每个属性定义了Getter and Setter方法,例如阻尼比和刚度。
阻尼比
阻尼比定义了描述了弹簧振荡的阻力大小:、
- 当阻尼比大于1时发生过阻。 它使对象快速返回到休息位置。
- 当阻尼比等于1时发生临界阻尼。 它使对象在最短的时间内返回到休息位置。
- 当阻尼比小于1时发生欠阻尼。 它通过传递静止位置使物体多次过冲,然后逐渐达到静止位置。
- 当阻尼比等于零时,就会发生阻尼。 它让对象永远振荡起来。
要向弹簧增加阻尼比,请执行以下步骤:
- 调用getSpring()方法来获得SpringForce以添加阻尼比。
- 调用setDampingRatio()方法并传递要添加到弹簧的阻尼比。 该方法返回设定阻尼比的弹簧力对象。注意:阻尼比必须是非负数。 如果将阻尼比设置为零,弹簧将永远不会到达静止位置。 换句话说,它永远振荡。
系统定义的阻尼常量:
- DAMPING_RATIO_HIGH_BOUNCY (高反弹)
- DAMPING_RATIO_MEDIUM_BOUNCY(中反弹)
- DAMPING_RATIO_LOW_BOUNCY(低反弹)
- DAMPING_RATIO_NO_BOUNCY(无反弹)
设置阻尼比
final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);
…
//Setting the damping ratio to create a low bouncing effect.
anim.getSpring().setDampingRatio(DAMPING_RATIO_LOW_BOUNCY);
刚性
刚度定义弹簧常数,用于测量弹簧的强度。 当弹簧不在静止位置时,刚性弹簧对附着的物体施加更大的力。
以下刚度常数在系统中可用:
- STIFFNESS_HIGH
- STIFFNESS_MEDIUM
- STIFFNESS_LOW
- STIFFNESS_VERY_LOW
例子:
final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);
…
//设置弹簧的刚度
anim.getSpring().setStiffness(STIFFNESS_LOW);
创建自定义弹簧力
您可以创建自定义弹簧力作为使用默认弹簧力的替代方法。 定制弹簧力使您可以在多个弹簧动画中共享相同的弹簧力实例。 创建弹簧力后,可以设置阻尼比和刚度等属性。
- 创建一个SpringForce对象。“
通过调用相应的方法分配属性。 您也可以创建一个方法链。
//创建一个SpringForce对象
SpringForce force = new SpringForce();
//设置属性
force.setDampingRatio(DAMPING_RATIO_LOW_BOUNCY).setStiffness(STIFFNESS_LOW);
//为动画设置force
anim.setSpring(force);
官方文档:https://developer.android.com/preview/features/spring-animation.html