Android动画深入分析

Android动画可以分为三种:view动画、帧动画、属性动画

View动画:通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果,它是一种渐进式动画,并且View动画支持自定义

帧动画:通过顺序播放一系列图像从而产生动画效果,可以简单理解为图片切换动画,很显然,如果图片过大很容易导致OOM

属性动画:通过动态地改变对象的属性从而达到动画效果

一、View动画

View动画的作用对象是View,它支持4种动画效果,分别是平移动画、缩放动画、旋转动画和透明动画。除了这四种动画之外,帧动画也属于View动画。

1.1 View动画的种类

View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation。这四种动画可以通过XML来创建,也可以通过代码来创建,对于View动画来说建议采用XML来创建动画,这是因为XML可读性更好。

View动画的四种变换

View动画都有固定的语法:

从上面的语法可看出,View动画既可以是单个动画,也可以由一系列动画组成

<set>标签标示动画集合,对应SetAnimation类,可以包含多个若干个动画,并且其内部也可以嵌套其他动画集合的,其中两个属性含义如下:

android:interpolator

表示动画集合所采用的插值器,插值器影响动画的速度,比如非匀速动画就需要通过插值器来控制动画的播放过程

android:shareInterpolator

表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或者使用默认值。

translate 表示平移动画

android:fromXDelta——表示X的起始值

android:fromYDelta——表示Y的起始值

android:toXDelta——表示X的结束值

android:toYDelta——表示Y的结束值

scale 表示缩放动画

android:fromXScale——水平方向缩放的起始值

android:fromYScale——竖直方向缩放的起始值

android:pivotX——缩放的轴点的x坐标,它会影响缩放的效果

android:pivotY——缩放的轴点的y坐标,它会影响缩放的效果

android:toXScale——水平方向缩放的结束值

android:toYScale——竖直方向缩放的结束值

默认情况下轴点是View的中心点,这个时候再水平方向进行缩放的话会导致View向左右两个方向同时进行缩放,但是如果把轴点设为View的右边界,那么View就只会向左边进缩放,反之则向右边进行缩放。

rotate 表示旋转动画

android:pivotY——旋转的轴点的x坐标

android:fromDegrees——旋转开始的角度

android:pivotX——旋转的轴点的y坐标

android:toDegrees——旋转结束的角度

alpha 透明度动画

android:fromAlpha——表示透明度的起始值

android:toAlpha——表示透明度的结束值

View动画还有其他属性:

android:duration——动画的持续时间

android:fillAfter——动画结束之后View是否停留在结束位置,true表示停留在结束位置

1.2 帧动画

帧动画是顺序播放一组预先定义好的图片,类似电影播放。不同于View动画,系统提供了另外一个类AnimationDrawable来使用帧动画。

首先需要通过xml来定义一个AnimationDrawable:

比较容易引起oom。

二、View动画的特殊使用场景

2.1 LayoutAnimation

LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会有这种动画效果。

android:delay 

表示子元素开始动画的时间延迟,比如子元素入场动画的时间周期为300ms,那么0.5表示每一个子元素都需要延迟150ms才能播放入场动画

android:animation

为子元素指定具体的入场动画

android:animationOrder

表示子元素动画的顺序,有三种选项:normal、reverse和random,其中normal表示顺序显示,即排在前面的子元素先开始播放入场动画,reverse表示逆向显示,即排在后面的子元素先开始播放入场动画,random则是随机播放入场动画

2.2 Activity的切换效果

Activity有默认的切换效果,但是这个效果我们是可以自定义的,主要用到overridePendingTranslation(int enterAnim,int exitAnim)这个方法,这个方法必须在startActivity或者finish之后被调用才能生效,参数含义:

enterAnim——activity被打开时,所需的资源id

exitAnim——activity被暂停时,所需的动画资源id

Frament可以通过FragmentTransaction中的setCustomAnimations()方法来添加切换动画。

三、属性动画

3.1 使用属性动画

属性动画可以对任意对象的属性进行动画而不仅仅是View,动画默认时间间隔300ms,默认帧率10ms帧。其可以达到的效果是:在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。

属性动画是从API11才有,这就严重制约了属性动画的使用,可以采用开源动画库nineoldandroids。

nineoldandroids比较常用的几个动画类是:ValueAnimator、ObjectAnimation和AnimatorSet,其中ObjectAnimation继承ValueAnimator。

1)改变一个对象的translationY属性,让其沿着Y轴向上平移一段距离:

ObjectAnimation.ofFloat(myObject,"translationY",-myObject.getHeight()).start();

2)改变一个对象的背景色属性,典型的情形是改变View的背景色

让背景色在3秒内实现从0XFFFF8080到0xFF8080FF的渐变,动画会无限循环而且会有反转的效果

ValueAnimator valueAnimator colorAnim=ObjectAnimation.ofInt(this,"backgroundColor",/*Red*/0xFFFF8080,/*Blue*/0xFF8080FF);

colorAnim.setDuration(3000);

colorAnim.setEvaluator(new ArgbEvaluator());

colorAnim.setRepeatCount(ValueAnimator.INFINITE);

colorAnim.setRepeatMode(ValueAnimator.REVERSE);

colorAnim.start();

3)动画集合,5秒内对view的旋转、平移、缩放和透明度都进行了改变

属性动画也可以通过XML定义,代码如下:

其中,<set>标签对应AnimatorSet,<animator>标签对应ValueAnimator,<objectAnimator>对应ObjectAnimator。

其中,set标签的android:ordering属性有两个可以选择(默认值是together):

together:表示动画集合中的子动画同时播放

sequentially:表示动画集合中的子动画按照前后顺序依次播放

android:propertyName——表示属性动画的作用对象的属性的名称

android:duration——表示动画的时长

android:valueFrom——表示属性的起始值

android:valueTo——表示属性的结束值

android:startOffset——表示动画的延迟时间,当动画开始后,需要延迟多少毫秒才会真正播放此动画

android:repeatCount——表示动画的重复次数,默认是0,-1表示无限循环

android:repeatMode——表示动画的重复模式,restart表示连续重复,reverse表示逆向重复

android:valueType——表示android:propertyName所指定的属性的类型

如果android:propertyName所指定的属性表示的是颜色,那么不需要指定valueType,系统会自动对颜色类型的属性做处理

3.2 理解插值器和估值器

TimeInterpolator中文翻译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LineaeInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等。

TypeEvaluator的中文翻译为类型估值算法,也叫估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator(针对整型属性)、FloatEvaluator(针对浮点型属性)和ArgbEvaluator(针对color属性)。

对于匀速动画,则使用的是线性插值器:

线性插值器源码

很显然,线性插值器的返回值和输入值一样,因此插值器返回的值是0.5,这意味着x的改变也是0.5,这个时候插值器的工作就完成了。

整型估值器源码

evaluate的三个参数分别表示估值小数、开始值、结束值。

属性动画要求对象的该属性有set和get方法(可选)。

可自定义插值器与估值算法,其中,自定义插值器需要实现Interpolator或者TimeInterpolator,自定义估值算法需要实现TypeEvaluator。如果要对其他类型(非int、float、Color)做动画,那么必须要自定义类型估值算法。

3.3 属性动画的监听器

属性动画提供了监听器用于监听动画的播放过程,主要有如下两个接口:AnimatorUpdateListener和AnimatorListener。

AnimatorListener

可监听动画的开始、结束、取消以及重复播放

AnimatorUpdateListener

会监听这个动画过程,动画每播放一帧,就会被调用一次

3.4 对任意属性做动画

属性动画原理:属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切的说是随着时间的推移,所传递的值越来越接近最终值。总结一下,我们对object的属性abc做动画,如果想让动画生效,要同时满足两个条件:

1、object必须要提供setAbc方法,如果动画的时候没有传递初始值,那么还要提供getAbc方法,因为系统要去取abc属性的初始值。

2、object的setAbc对属性abc所做的改变必须通过某种方法来反映出来,比如带来UI得改变之类的。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 7.1 View 动画 View 动画对应这 Animation 的四个子类: 标签表示动画集合,对应 Anima...
    kongjn阅读 330评论 0 0
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,697评论 0 10
  • 从上个版本开始,工程的Appstore安装包竟然达到了53M,简直到了不能忍的地步,工程瘦身势在必行。 1,删除自...
    悟_空阅读 2,936评论 27 84
  • 鹿玙—40 她姓孙,我们都叫她孙主任。 孙主任年近五十岁,对你来说她也许只是芸芸众生中的一个,普通的不能再普通,但...
    鹿玙阅读 255评论 2 1
  • 我不是习惯晚睡 只是夜里没有你的对白 令我有点狼狈
    风吟依旧阅读 176评论 0 0