Android属性动画和视图动画的区别

提起动画首先想到的是动画片,童年最爱的黑猫警长,葫芦娃,邋遢大王,大脸猫和蓝皮鼠,四驱兄弟,七龙珠等等,当时觉着好神奇,他们是怎么动的呢。动画其实就是一帧帧的画面顺序播放,只要画面切换的够快,会我们眼中形成视觉残留的效果,人眼不会感觉到突兀也就会认为画面是连续运动的,至于24帧什么的这里就不说了,现在的手机普遍支持60帧每秒,微鲸的vr设备好像87帧每秒,只要游戏本身不卡顿,玩起来还是挺流畅的。动画可以实现各种各样的特效,android平台开发过程中动画也相当重要。
Android平台提供了强大的动画框架,使我们在完成复杂的特效时不用自己改变空间的位置或者设置属性通过简单的动画代码就可以实现,android3.0之前,主要包括两种动画方式:补间动画(Tween Animation)和帧动画(Frame Animation 或者 Drawable Animation),这两种动画统称为view 动画,针对视图动画存在的不足,3.0之后google增加了属性动画(Property Animation)。之后动画就被分成了View Animation 和Property Animation。

关于动画的一道面试题:
在应用中常看到不断变化的数字怎么实现?

视图动画:

1 补间动画(Tween Animation):

  补间动画是视图动画的一种,Tween中文意思是在两者之间,中文翻译成补间还是挺贴合意思的,view从一个位置的特定状态变化到另外一个位置,中间过程我们开发者不需要自己完成,补间动画会根据我们属性的设置自己进行每一帧的补充,最后展现一个变化的过程,就叫做补间动画(自己理解)。

补间动画可以(仅可以)完成view的位置、大小、旋转、透明度等一系列简单的变换,可通过xml文件或者代码实现,通常补件动画都是利用xml文件实现,属性设置简单明了,又可以重复使用。

 基于View的渐变动画,她只改变了View的绘制效果,而实际属性值未变。比如动画移动一个控件的位置,但控件实际位置仍未改变,如果我们此时想选中控件,它的位置仍在动画之前的位置。可以在res/anim/文件夹中定义XML文件实现动画,也可以利用AnimationSet类和Animation的子类完成动画。
  • alpha 渐变透明度动画效果
  • scale 渐变尺寸伸缩动画效果
  • translate 画面转换位置移动动画效果
  • rotate 画面转移旋转动画效果
    举例:放在res/anim/文件夹下:
  <?xml version="1.0" encoding="utf-8"?>  
    <scale xmlns:android="http://schemas.android.com/apk/res/android"  
        android:fromXScale="0.0"  
        android:toXScale="1.1"  
        android:fromYScale="0.0"  
        android:toYScale="1.1"  
        android:pivotX=30"  
        android:pivotY="20"  
        android:duration="500" />  

补间动画使用很方便,但也有很大的局限性,首先动画虽然执行了但是只是我们看到的,控件真实的位置透明度等都没有变化,如果我们想对一个已经移动的控件执行点击事件,如果控件移动的位置比较大点击界面上看到的控件是无法触发事件的。

补间动画只能针对设计好的特定的几种属性执行动画,对于自定义的属性则不太好完成(或者说根本不支持)。

2 帧动画(Frame Animation 或者 Drawable Animation):

帧动画也是view动画的一种,帧动画是通过读取xml文件中设置的一系列Drawable,以类似幻听片的方式展示这些drawable,就形成了动画效果,当然也可以利用代码实现帧动画。可能大家觉着帧动画不太常用,其实类似的原理可以借鉴,类似android手机开机的很多动画效果就是类似帧动画,加载一系列图片,实现开机的动画效果。

 在代码中定义动画帧,使用AnimationDrawable类;XML文件能更简单的组成动画帧,在res/drawable文件夹,使用<animation-list>采用<item>来定义不同的帧。

但是依旧推荐使用xml,具体如下:
<animation-list> 必须是根节点,包含一个或者多个<item>元素,属性有:

· android:oneshot true代表只执行一次,false循环执行。
· <item> 类似一帧的动画资源。
<item> animation-list的子项,包含属性如下:
· android:drawable 一个frame的Drawable资源。
· android:duration 一个frame显示多长时间。
文件放在res/drawable/目录下

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="drawable_resource"
        android:duration="integer" /></animation-list>

帧动画是最简单的动画,用的比较少。

3 属性动画(Property Animation):

 属性动画在视图动画之后推出,API 11 以上才能够使用,是为了弥补视图动画存在的问题,从名字可以看出属性动画和视图动画的不同,视图动画主要针对视图起作用,属性动画则是通过改变Object的属性进行动画实现。通过改变view或者object的属性实现动画是属性动画的最根本的特点。

对数值的操作:

ValueAnimator animator = ValueAnimator.ofInt(0,700);  

 animator.setDuration(1000);  

 animator.start(); 

对view的操作:

ObjectAnimator animator = ObjectAnimator.ofFloat(view,"alpha",1,0,1);  

animator.setDuration(1000);  

animator.start();  
  • 第一个参数用于指定这个动画要操作的是哪个控件
  • 第二个参数用于指定这个动画要操作这个控件的哪个属性
  • 第三个参数是可变长参数,这个就跟ValueAnimator中的可变长参数的意义一样了,就是指这个属性值是从哪变到哪

添加监听:

ValueAnimator animator = ValueAnimator.ofInt(0,400);  

animator.setDuration(1000);  

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  

    @Override  

   public void onAnimationUpdate(ValueAnimator animation) {  

       int valcur = (int)animation.getAnimatedValue();  

    }  

});  

animator.start();  

4 视图动画和属性动画的区别:

由于出现的时间不同,视图动画和属性动画有几个显而易见的不同:

视图动画早于属性动画,视图动画在API 1里面就已经存在,属性动画直到API3.0才出现,视图动画所在的包名为android.view.animation,属性动画为android.animation,可见视图动画只针对view起作用;试图动画中用到的类一般以Animation结尾,而属性动画则以Animator结尾。

为什么引入视图动画:

帧动画可以通过顺序播放资源来实现动画的,补间动画可以实现控件的渐入渐出、移动、旋转和缩放效果。但类似利用动画改变View的背景或者改变一个数值或者改变一个对象的属性视图动画就无法完成此类工作了,所以视图动画存在局限性。属性动画还支持监听动画过程,在动画过程中自己操作控件进行改变。

视图动画的文件在android.view.animation下,通过学习也可以知道,视图动画只能作用于视图,实现类似缩放、旋转功能,动画效果比较固定;而属性动画可以通过改变View的属性完成动画,利用setxxx()和getxxx()函数可以对Object的任意属性改变,从而可以实现视图动画实现不了的功能。可以通过在object中添加属性的set函数,在ondraw方法中操作属性就可以完成动画

属性动画通过改变view属性实现动画,而视图动画虽然利用动画改变了view的位置和大小,但view真正的属性没有改变,这就会导致许多问题,视图动画过后我们再去操作view则得不到响应,这就是为什么自定义控件利用动画改变控件位置后还有调用layout()设置view位置的原因,这样才能真正的改变view的位置,而属性动画就可以一步到位的完成。

总结如下:

(1)属性动画比视图动画更强大,不但可以实现缩放、平移等操作,还可以自己定义动画效果,监听动画的过程,在动画过程中或完成后做响应的动作。
(2)属性动画不但可以作用于View,还能作用于Object。
(3)属性动画利用属性的改变实现动画,而视图动画仅仅改变了view的大小位置,但view真正的属性没有改变。

完!后续会对属性动画,视图动画,插值器,自定义属性动画等进行系列介绍。

动画入门和进阶文章列表:

Animation动画概述和执行原理
Android动画之补间动画TweenAnimation
Android动画之逐帧动画FrameAnimation
Android动画之插值器简介和系统默认插值器
Android动画之插值器Interpolator自定义
Android动画之视图动画的缺点和属性动画的引入
Android动画之ValueAnimator用法和自定义估值器
Android动画之ObjectAnimator实现补间动画和ObjectAnimator自定义属性
Android动画之ObjectAnimator中ofXX函数全解析-自定义Property,TypeConverter,TypeEvaluator
Android动画之AnimatorSet联合动画用法
Android动画之LayoutTransition布局动画
Android动画之共享元素动画
Android动画之ViewPropertyAnimator(专用于view的属性动画)
Android动画之Activity切换动画overridePendingTransition实现和Theme Xml方式实现
Android动画之ActivityOptionsCompat概述
Android动画之场景变换Transition动画的使用
Android动画之Transition和TransitionManager使用
Android动画之圆形揭露动画Circular Reveal
Android 动画之 LayoutAnimation 动画
Android动画之视图动画的缺点和属性动画的引入

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

推荐阅读更多精彩内容

  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,580评论 0 9
  • 【Android 动画】 动画分类补间动画(Tween动画)帧动画(Frame 动画)属性动画(Property ...
    Rtia阅读 5,954评论 1 38
  • 转载一篇高质量博文,原地址请戳这里转载下来方便今后查看。1 背景不能只分析源码呀,分析的同时也要整理归纳基础知识,...
    Elder阅读 1,899评论 0 24
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,201评论 0 17
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    lisx_阅读 938评论 0 0