Physics-based Animation 学习总结_lyri的博客-程序员宝宝

技术标签: animation动画详解  android  Physics动画  Android  

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构建的。

这里写图片描述

Animator-based animation

这里写图片描述

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

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

这里写图片描述

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LYRIC_315/article/details/72758650

智能推荐

POJ 2955(区间dp)_superFool_song的博客-程序员宝宝

//简单区间DP//题意: 给你一串括号 问你最多有几个可以匹配// dp[i][j]表示从i到j 最多可以匹配的括号数// dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k+1][j]+2)(str[i]与str[k]可以匹配)#include#include#define N 110#define max(a,b) a>

判断一个域名是否合法_dengshouzi7943的博客-程序员宝宝

生活中我们肯定会见到很多域名(domain name,简称domain)。域名有很多形式,以句点(.)作为分隔符。这里说的域名是纯域名,不是网址,不包括http://(或https://),也不带斜线。常见的域名形式1. 由两个部分组成,例如baidu.com(百度),csdn.net(CSDN),wikipedia.org(维基百科)。2. 由多个部分组成...

HTML5+CSS3快速入门每日一篇网页制作实战(附代码)DAY06-DAY07_前端小白吖的博客-程序员宝宝

myday6-day07 网页的制作实战(附自己的代码)(仿一个网站的网页)网页效果图自己的代码实现:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document<

你用TensorFlow做过哪些有趣的尝试?_Mc顽固份子的博客-程序员宝宝

点击查看全文TensorFlow等AI工具包的出现,让程序员不掌握原理也能迅速学会机器学习或人工智能技术的使用。我曾经用TensorFlow分析A股上亿条交易数据,尝试在A股市场寻找一些确定性的规律知乎上的一名产品经理,使用TensorFlow和OpenCV通过人工神经网络识别出王者荣耀中的各个英雄一个做数据安全的朋友,通过采集服务器集群的服务器运行日志和配置数

leetcode-89. 格雷编码_zmm_mohua的博客-程序员宝宝

leetcode-89. 格雷编码题目:代码:#include <iostream>#include <vector>#include <algorithm>using namespace std;/**设 n阶格雷码集合为 G(n),则 G(n+1)阶格雷码为:给 G(n) 阶格雷码每个元素二进制形式前面添加 0,得到 G′(n);设 G(n)集合倒序(镜像)为 R(n),给 R(n) 每个元素二进制形式前面添加 1,得到 R'(n)G(n+1

小试——四舍五入(C语言实现)_骑猪战吕布的博客-程序员宝宝

%.0f 输出 float 型或 double 型数据最终输出浮点数的整数部分,不输出小数点和小数点以下部分,小数部分 4 舍 5 入例如:printf("%.0f %.0f ",123.5,123.4);输出 124 123#include<stdio.h>int main(){ int a=100; float b=0.4; float c=0.7; printf("%d\n",a); // prin...

随便推点

用python实现客户端的设想(curses、Tkinter)_wonder365x的博客-程序员宝宝_uniface客户端

有一种说法:程序员是最懒的。只有懒人才会在多种的实现方式中寻找最省力的。 在长期的编程实践中,对客户端程序的零乱、开发不易、费时费力、不变于修改已经感到深恶痛绝。所以将其特点总结如下(特别是三层构架中的界面展现部分): 响应时间要求不严格,通常零点几秒是可以忍受的 功能不多,一般情况下是输入一些内容,通过功能键或者按钮提交到后台服务,将返回结果显示给用户 要求用户界面尽量简单,有助于客户学习 可

2021-2027中国COP注射器市场现状及未来发展趋势_简乐尚博(168Report)的博客-程序员宝宝

2021-2027中国COP注射器市场现状及未来发展趋势本报告研究中国市场COP注射器的生产、消费及进出口情况,重点关注在中国市场扮演重要角色的全球及本土COP注射器生产商,呈现这些厂商在中国市场的COP注射器销量、收入、价格、毛利率、市场份额等关键指标。此外,针对COP注射器产品本身的细分增长情况,如不同COP注射器产品类型、价格、销量、收入,不同应用COP注射器的市场销量等,本文也做了深入分析。历史数据为2016至2021年,预测数据为2021至2027年。主要厂商包括: Anta...

1215_Minami丶Kotori的博客-程序员宝宝

#include #include #include #include char message[]="hello world!";void * thread_function(void *arg){    printf("thread function is running, argument is %s\n",(char *)arg);    sleep(3

XJOI一级四段题解(g++,即C++),也可视作C++算法竞赛教程_rrc12345的博客-程序员宝宝_xjoi分西瓜

XJOI一级四段所有题目题解,包含知识点讲解,一学就会的XJOI题解。也可视作C++算法竞赛教程进行学习。

百度如何能实时检索到15分钟前新生成的网页?_onyas的博客-程序员宝宝

百度如何能实时检索到15分钟前新生成的网页?