Physics-based Animation 学习总结

Android O 出来了,带来了一种全新的动画 Physics-based Animation
先上Demo地址:https://github.com/lyric315/SpringAnimationTest
效果图:

概述

Physics-based Animation依赖于物理规律,在动画中表现出高度的现实感。 在我们的日常生活中,当一个变化发生时,我们会自然而然的意识到它会伴随着一段物理的变化过程。 同样地,我们很容易觉察到更自然、不间断以及保持动力的动画。

How does Physics-based Animation work?

Physics-based Animation使用物理学的基础来构建动画。 一个动画是用力来驱动的。 当力达到平衡时,动画就会休息。 新的动画API融入了物理学规律,以呈现更自然和灵活的动画。

Physics-based Animation 学习总结_第1张图片

优点

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 学习总结_第2张图片

Animator-based animation

Physics-based Animation 学习总结_第3张图片

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类允许您定制弹性的刚度、阻尼比和最终位置。 一旦动画开始,弹性力就会更新动画值和每帧的速度。 动画持续到弹性力达到平衡。

例如,如果您在屏幕上拖动应用程序图标,然后松手,则图标将通过隐形但熟悉的力量拖动到原始位置。

Physics-based Animation 学习总结_第4张图片

Spring Animation

创建弹簧动画

主要步骤是创建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 允许你去监听动画的结束,当动画达到均衡或取消时,接收回调。 要注册监听器,请执行以下步骤:

  1. 调用addEndListener()方法并将监听器附加到动画。
  2. 覆盖onAnimationEnd()方法,以便每当动画达到均衡或被取消时接收通知。

设置弹簧属性

SpringForce类为每个属性定义了Getter and Setter方法,例如阻尼比和刚度。

阻尼比

阻尼比定义了描述了弹簧振荡的阻力大小:、

  • 当阻尼比大于1时发生过阻。 它使对象快速返回到休息位置。
  • 当阻尼比等于1时发生临界阻尼。 它使对象在最短的时间内返回到休息位置。
  • 当阻尼比小于1时发生欠阻尼。 它通过传递静止位置使物体多次过冲,然后逐渐达到静止位置。
  • 当阻尼比等于零时,就会发生阻尼。 它让对象永远振荡起来。

要向弹簧增加阻尼比,请执行以下步骤:

  1. 调用getSpring()方法来获得SpringForce以添加阻尼比。
  2. 调用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);

创建自定义弹簧力

您可以创建自定义弹簧力作为使用默认弹簧力的替代方法。 定制弹簧力使您可以在多个弹簧动画中共享相同的弹簧力实例。 创建弹簧力后,可以设置阻尼比和刚度等属性。

  1. 创建一个SpringForce对象。“
  2. 通过调用相应的方法分配属性。 您也可以创建一个方法链。

    //创建一个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

你可能感兴趣的:(Android)