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是相当静态的,并且具有固定的持续时间。 为了适应目标值的变化,您需要在目标值更改时取消动画,将当前值的动画重新配置为新的起始值,并添加新的目标值。 在视觉上,这个过程会造成动画的突然中断以及不连贯的动作。
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弹性动画模仿弹簧的变化过程,基于施加在每个对象上的弹性力来计算值和速度。
在弹性动画中, 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属性:
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 允许你去监听动画的结束,当动画达到均衡或取消时,接收回调。 要注册监听器,请执行以下步骤:
SpringForce类为每个属性定义了Getter and Setter方法,例如阻尼比和刚度。
阻尼比定义了描述了弹簧振荡的阻力大小:、
要向弹簧增加阻尼比,请执行以下步骤:
系统定义的阻尼常量:
设置阻尼比
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);
刚度定义弹簧常数,用于测量弹簧的强度。 当弹簧不在静止位置时,刚性弹簧对附着的物体施加更大的力。
以下刚度常数在系统中可用:
例子:
final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);
…
//设置弹簧的刚度
anim.getSpring().setStiffness(STIFFNESS_LOW);
您可以创建自定义弹簧力作为使用默认弹簧力的替代方法。 定制弹簧力使您可以在多个弹簧动画中共享相同的弹簧力实例。 创建弹簧力后,可以设置阻尼比和刚度等属性。
通过调用相应的方法分配属性。 您也可以创建一个方法链。
//创建一个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