Android 动画之属性动画(一)

Android 动画之属性动画(一)#


说到动画,先给大家一点概念。众所周知,动画其实是很多帧的图片以小于人类眼睛所能识别最小的时间间隔进行播放,而Android里面的动画的原理就是通过一个 来管理一个 ,通过这个类,可以持续地改变这个值,画面本身与这个 相关,于是就相当于产生一帧一帧的画面,从而形成动画。

什么是属性动画(Property Animation),先来看看官方的解释

The property animation system is a robust framework that allows you to animate almost anything. You can define an animation to change any object property over time, regardless of whether it draws to the screen or not. A property animation changes a property's (a field in an object) value over a specified length of time.

它是为了弥补补间动画(Tween Animation)的缺陷所引入的,比起补间动画的优势有

  1. 补间动画只能对view对象进行操作,但是属性动画可以对任何Object的任何属性进行操作,不管是看见还可是不可见
  2. 补间动画只提供了移动,缩放,旋转,淡入淡出这几种动画,而补间动画则可以实现上述动画之外的更多效果
  3. 补间动画还有一个致命缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。什么意思呢?比如说,现在屏幕的左上角有一个按钮,然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已,而属性动画则是完全改变了view的属性
  4. 但是补间动画 的建立时间会比 属性动画 动画要短,代码量也会更少,当补间动画可以满足所需要的动画效果时,首先使用补间动画!

The characteristics of an porperty animation##

在属性动画里面,有如下特性:

  • Duration(动画运行持续时间):默认300ms
  • Time interpolation(时间内插值):简单来说,想象一个值从0变到1,中间产生50个值,Time interpolation 就决定了产生的值是均匀的(0,0.2,0.4,0.6,..1)还是加速的(0,0.1,0.3,0.6,1)或者减速,或者抛物线等等
  • Repeat count and behavior(重复时间和行为):决定动画的效果重复几次以及是否进行逆过程,就是play back in reverse
  • Animator sets(动画集):你可以把几个动画效果存放到一个集合中,进行顺序序播放或者延时等等
  • Frame refresh delay(帧更新频率):决定动画帧更新的频率,通常是10ms,具体取决于系统的运行情况以及系统所提供的计时器

How Property Animation Works##

记住以上的几个特性后,接下来看看属性动画是怎样实现的:
下面是两个简单的例子,对于一个假想的Object对它的 x(位移)的属性进行动画


 figure 1.Example of a linear animation

 figure 2.Example of a non-linear animation

上述两个例子的动画效果是随着时间的变化,x的值发生变化,并且每10ms更新一次 x 值,从而实现了,但是也可以看到两个例子的区别是 例1 是匀速地进行位移,而 例2 则是变速的进行位移。也就是两者的Time interpolation 是不一样的。

创建一个动画需要创建一个ValueAnimator对象(当然接下来你会知道还有其他的)来对被动画的对象进行管理。它记录着动画的进程以及进行动画的属性的当前值。一个 ValueAnimator 封装(encapsulate)如下几个对象:

  • elapsed fraction :这是一个用于记录动画进程的参数,值的变化范围从0~1,0代表动画进行到0%,1代表动画进行到100%,它的变化情况取决于  Duration 以及动画进行了多久
  • TimeInterpolator:这是一个内插值管理器,利用 interpolated fraction 这个参数来管理 Time interpolation例1 中的 TimeInterpolator 就是一个线性的 Interpolator ,它的 Interpolator fraction 就会线性均匀地变化, 例2 就是一个先加速后减速的Interpolator,它的Interpolator fraction变化情况也是先加速后减速
  • TypeEvaluator:它和 TimeInterpolator 一样,也是一个数值管理器,它的参数是就是所要进行的动画的属性值,例如上面例子中的 x ,而且注意到 x 是一个整数值,所以它的 TypeEvaluator 是一个 IntEvaluator

Property Animation 的内部是怎么运行的呢,与上面提到的四个对象有着重大关联:

  1. VulueAnimator 通过调用start()方法后,就会根据 Duration 和当前已经运行了多少时间去计算 elapsed fraction
  2. elapsed fraction 被计算出来后,就会去调用 TimeInterpolator ,然后 TimeInterpolator 就会相应地计算出interpolated fraction ,不同类型的 TimeInterpolator 就会计算出不同的值。比如 例1 中,在10ms的时候, elapsed fraction = 0.25, interpolated fraction = 0.25 而在 例2 中, elapsed fraction = 0.25, interpolated fraction = 0.15
  3. interpolated fraction 计算完成后,就会调用 TypeEvaluator ,根据 interpolated fraction 来计算出属性值,比如上述两个例子中 x = interpolated fraction * 40

API Overview##

(请在仔细复习一下 How Property Animation Works 这一部分)
Property Animation 有了一个初步了解之后,接下我们来看看属性动画的一些常用的类和方法

Animator类###

  • ValueAnimatorValueAnimator 最主要的类,它用来计算 属性动画 的属性值,它包含了计算属性值的所有核心函数,动画的信息比如是否重复,监听器信息等等。对于实现一个动画有两部分,第一部分是计算属性值,第二部分是把这些值设置到你要进行的动画的属性或者对象中。而 ValueAnimator 只负责实现第一部分,所以必须为 ValueAnimator 设置一个监听器,每当属性值有改变时,进行你需要的操作
  • ObjectAnimatorValueAnimator 的一个子类。上面说到,ValueAnimator 需要自己手动为对象设置值,而 ObjectAnimator 则可以包含这一部分,可以指定你的目标对象,在大部分情况下,我们都是使用 ObjectAnimator 来进行 属性动画
  • AnimatorSet:它提供一个机制来管理多个动画,比如现在有一个位移动画和缩放动画,它可以为把这两个动画归为一组,来管理他们的播放次序以及播发时间等等

Evaluator类###

Evaluator 告诉 Animator 如何去计算给定的属性值。它根据 Animator 给定的数据来计算得出属性值,常用的 Evaluator 有如下

  • IntEvaluator: 系统默认的 Evaluator ,用于计算 Int 类型的属性值
  • FloatEvaluator:系统默认的 Evaluator ,用于计算 Float 类型的属性值
  • ArgbEvaluator:系统默认的的 Evaluator,用于计算color类型的属性值,并且这个color是以16进制数表示的
  • TypeEvaluator:系统提供的一个 Evaluator 接口,用于实现自定义的Evaluator

Interpolators类###

Time Interpolators 其实是一个时间的函数,根据时间,计算出 interpolated fraction ,不同的 Time Interpolators 决定了不同函数,比如说它可以是线性的,那么在动画播放的这段时间里,他是均匀变化的,它也可以是非线性的,比如说动画可以先加速后减速,下面列出一些系统默认的 Time Interpolators

  • AccelerateDecelerateInterpolator :先加速后减速的 Time Interpolators
  • AccelerateInterpolator :缓慢开始然后加速的 Time Interpolators
  • AnticipateInterpolator :先往后在往前的 Time Interpolators
  • AnticipateOvershootInterpolator :先往后再往前,超过目标值后再回来的 Time Interpolators
  • BounceInterpolator :到达目标值后会反弹的 Time Interpolators
  • CycleInterpolator :循坏的 Time Interpolators
  • DecelerateInterpolator :减速的 Time Interpolators
  • LinearInterpolator :线性的 Time Interpolators
  • OvershootInterpolator :超过目标之后在回来的 Time Interpolators
  • TimeInterpolatorTime Interpolators 的一个接口,继承他可以重写自定义的 Time Interpolators
大概了解了Property Animation的基础知识,下一篇将介绍如何具体使用属性动画
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容