在上一篇博客中。我们简单了解了在Android中的动画特效。小伙伴们是不是意犹未尽呀。

还没有看的猛戳这里:Android动画之旅一开篇动画简单介绍

本篇博客。将和大家一起来分析Android中的四大动画,准备好了吗?GO~ GO~ GO~

Android动画大致能够分为下面四类:

(1)逐帧动画(Frame Animation)

(2)补间动画(Tween Animation)

(3)属性动画(Property Animation)

(4)布局动画(Layout Animation)

Android3.0(即API
Level11)曾经,Android仅支持2种动画:各自是Frame Animation(逐帧动画)和Tween Animation(补间动画),在3.0之后Android支持了一种新的动画系统。称为:Property
Animation(属性动画)。

首先,我们来分析逐帧动画(Frame Animation):

相信大家都知道皮影戏吧?简单的说就是人工操作一个皮质小人物来上演一场假人戏。

假设感觉这个抽象的话。那大家肯定都看过电影吧,事实上如今的电影院播放电影不能深刻体现我们的主题,在80年代的时候。那个时候播放电影都是在电影机上放上拍好的录像带,然后一轴一轴的播放出来。电影机连续的转动带动录像带,在荧屏上展现出连续的精彩画面。

事实上逐帧动画就好比播放电影,是将电影一帧一帧的展现出来。将连续的动作拆分成几个甚至几百个小动作。事实上现实生活中的样例非常多,比方我们如今看到的Gif动态图片,原理也是如此。

在Android中定义逐帧动画非常easy,大概分为两种实现方式:

(1)定义xml的drawable资源就能够轻松实现,以下来看详细的实现步骤:

定义Animation-list:

1.由于在res目录下,Androidproject默认是没有动画目录的。那么须要我们手动来创建,名字为:anim。

2.然后在anim目录下。创建一个animation-list的xml资源文件,命名符合规则随意就可以。

3.在animation-list的根元素能够指定android:oneshot属性。该属性指定是否仅播放一次。在item中有两个属性值,各自是drawable、duration。

android:drawable指定须要播放的每一帧图片。android:duration顾名思义,就是指定播放所须要的时间。

以上实现完毕之后。我们就能够在XML文件里使用该动画文件。

普通情况下。在Android中都会将该动画文件作为ImageView的background。

然后在代码中。通过获取ImageView的background,然后强转为AnimationDrawable就能够得到该动画Drawable资源。该类对象包括了start()stop()方法,即播放和暂停。单纯的获取到AnimationDrawable是不会自己主动播放的。所以还须要我们手动调用start()方法来開始动画

那么这样一个简单的逐帧动画效果就完毕了。

(2)在Java代码中实现:这样的方式也非常easy,在代码中手动创建AnimationDrawable对象。然后调用它的addFrame(Drawable
frame, int duration)方法将一帧帧drawable即图片加入进去,同一时候第二个參数也设置了播放该帧所须要的时间。小伙伴们能够亲自试下。效果本质是一样的。

应用场景:Loading载入。比如QQ JD的loading等等都是如此。

介绍完了逐帧动画,以下我们一起来分析下另外一种Android动画即补间动画。

补间动画也成为 Tween Animation。上面介绍的逐帧动画是须要一帧帧的去指定然后播放出来。补间动画能够理解为仅仅需指定開始、结束的“关键帧“,而变化中的其它帧由系统来计算,不必自己一帧帧的去定义。

补间动画在Android中分为四类:

(1)位移动画(TranslateAnimation)

(2)透明度动画(AlphaAnimation)

(3)旋转动画(RotateAnimation)

(4)缩放动画(ScaleAnimation)

四种动画,事实上使用方式都是大同小异的,以下我们以位移动画来简介在Android中怎样实现补间动画的效果。

Android使用Animation代表抽象动画,并在在java代码中创建Animation类对象。我们一般都会採取动画资源文件来定义动画,即在anim中定义动画资源文件。

在上图的代码中。我们定义了一个set的根元素,set代表了一组动画集合。只是指定一个动画也是能够的。

在set个元素中,我们指定了两个属性元素:

android:fillAfter
android:interpolator 

第一个属性是一个boolean类型的值。代表了当动画完毕后是否保留在动画结束。设置true即保留,反之。则不保留。

第二个属性比較重要,Android中叫它为插值器。它代表了一个动画附加的渲染效果,简单来说就是控制动画速度,以下我会简单解释下该属性相应的几种效果:

1. AccelerateInterpolator  加速插值器

   2. AccelerateDecelerateInterpolator  加速减速插值器

   3. LinearInterpolator 线性插值器

   4. BounceInterpolator 弹跳插值器

   5. AnticipateInterpolator 回荡秋千插值器

   6. AnticipateOvershootInterpolator

   7. CycleInterpolator 正弦周期变化插值器

   8. OvershootInterpolator 

详细效果能够參考Google官方的API Demo,此处也能够參考该博客进行仔细了解:http://www.cnblogs.com/mengdd/p/3346003.html

定义好anim文件后。我们能够通过AnimationUtils工具类来载入它们,载入成功后返回一个Animation。然后就能够通过View的startAnimation(anim)開始运行动画了。

Animation anim = AnimationUtils.loadAnimation(this, R.anim.translation);
//在代码中设置动画结束后保留结束状态,,假设xml中设置了就不须要在此处设置。 anim.setFillAfter(true);
//
在代码中设置插值效果

anim.setInterpolator(new CycleInterpolatorCycleInterpolator()); view. startAnimation(anim);

其它的动画和位移动画的使用方式差点儿同样。此处就不在一一列出,有兴趣的小伙伴们能够亲自体验一下。

说完了补间动画,以下我们就要说下大名鼎鼎的属性动画了。

属性动画,也称为Property Animation。

是在Android 3.0中引进的。它能够直接更改我们对象的属性。

在上面提到的补间动画(Tween
Animation)中,仅仅是更改View的绘画效果而View的真实属性是不改变的。如果你用Tween动画将一个Button从左边移到右边,不管你怎么点击移动后的Button,都不会有反应。而当你点击移动前Button的位置时才有反应。由于Button的位置属性是没有改变的。而属性动画(Property Animation)则能够直接改变View对象的属性值。这样能够让我们降低代码的编写难度,同一时候做出绚丽的动画效果。

属性动画分为两个部分:

(1)数值动画(ValueAnimator):包括Property
Animation动画的全部核心功能,如动画时间,開始、结束属性值。对应时间属性值计算方法等。

(2)对象动画(ObjectAnimator):继承自ValueAnimator,要指定一个对象及该对象的一个属性。当属性值计算完毕时自己主动设置为该对象的对应属性,即完毕了Property
Animation的所有两步操作。实际应用中一般都会用ObjectAnimator来改变某一对象的某一属性,但用ObjectAnimator有一定的限制,要想使用ObjectAnimator,应该满足下面条件:

1.对象应该有一个setter函数。

2.如以下的样例,像ofFloat之类的工场方法。第一个參数为对象名,第二个为属性名,后面的參数为可变參数,如果values…參数仅仅设置了一个值的话。那么会假定为目的值(目的值就是说如果是在X轴移动,就是从当前位置移动到的位置的数值),属性值的变化范围为当前值到目的值。为了获得当前值,该对象要有对应属性的getter方法,即getXXX()。

3.假设有getter方法,其应返回值类型应与对应的setter方法的參数类型一致。

假设以上条件不能满足,那么我们就仅仅能用ObjectAnimator的父类ValueAnimator来获取数值并自己实现动画了。

从上面的图中,我们看到创建ObjectAnimator对象时使用了ObjectAnimator类并调用其ofFloat()方法用来做移动。也因此我们能够知道。该类使用了工厂模式来设计ofXXX方法。ObjectAnimator除了提供ofFloat以外。还提供了一些其它的ofXXX方法:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

从图中能够看到Float、Argb、Object、Int、MultiInt、PropertyValuesHolder等等一些重载的方法,有兴趣的小伙伴能够去尝试一下。

在此说下ofPropertyValuesHolder这种方法,此方法是将多个PropertyValuesHolder对象集成在一起,也就是将多个动画合并在一起运行。也就是我们所谓的动画集:

能够看到,PropertyValuesHolder对象也和ObjectAnimator一样提供了一些ofXXX的方法。使用ObjectAnimator的ofPropertyValuesHolder将多个PropertyValuesHolder合并在一起来完毕整个动画效果,其它的方法此处就不再过多展示。

ObjectAnimator类还提供了addListener(AnimatorListener listener)方法,该方法用来监听动画的运行过程。

使用AnimatorListener须要实现它当中的4个方法:

(1)onAnimationStart:动画開始时回调。

(2)onAnimationEnd:动画结束时回调。

(3)onAnimationCancel:取消动画时回调。

(4)onAnimationRepeat:动画反复运行时回调。

以上就是动画的监听回调方法,这时候有的小伙伴就说,假设我仅仅想实现当中的一个方法怎么办?答案肯定是没问题,这个时候我们能够使用还有一种实现方式:

用AnimatorListenerAdapter这个类我们就能够实现自己想要实现的回调方法啦。是不是非常easy耶~

属性动画中另一个重要的类:AnimationSet。顾名思义,该类能够组合多个动画共同工作。

在上面我们说过一个组合动画的方式,相信大家都还记得吧。忘记的往上看吧哈哈。

使用AnimationSet,能够将多个动画集成在一起播放,AnimationSet提供了基本的几个方法:


从上面的程序能够看到。主要有下面几个方法:

(1)play:播放动画。

(2)with:和某个动画一起播放。

(3)before:在某个动画之前播放。

(4)after:在某个动画之后播放。

(5)playTogether:将多个动画同一时候播放。

(6)playSequentially:将多个动画按顺序播放。

以上方法是用相对来说还是比較简单的。就不再多说了。大家能够试着写一下就会非常明确的。

最后另一个动画类ViewPropertyAnimator,即对一个View同一时候改变多种属性。很推荐用这样的。该类对多属性动画进行了优化,会合并一些invalidate()来降低刷新视图。并且使用起来很简便,可是要求API LEVEL 12,即Android 3.1以上。仅须要一行代码就可以完毕水平、竖直移动。

tv.animate().translationX(150f). translationY(150f);
非常easy,不再多说。


上面用了非常多的篇幅来介绍了属性动画。以下我们介绍最后一个动画,即布局动画。 

布局动画即为ViewGroup来加入动画,也能够理解为为ViewGroup中的子View加入统一的动画效果。

实现布局动画须要使用LayoutAnimationController类完毕:

上图代码中,我们使用LayoutAnimationController类来创建了一个布局动画,非常easy。仅仅须要我们将Animation作为LayoutAnimationController类的构造方法參数传入就可以。

LayoutAnimationController实例的setOrder方法用来指定播放顺序,最后使用一个ListView方法的setLayoutAnimation方法,将动画绑定的ListView上。

我们分别从Android动画的分类来一一具体介绍了Android中的几大动画,以及使用的方法。相信小伙伴们对于Android的动画又有了全新的认识吧!下一篇博客,我将带领大家一起用Android属性动画系统的完毕一个小小的实战案例:Android动画之旅 一 仿简聊App动画菜单。

好啦,本篇博客就到这里啦,有错误的地方还请大家积极提出,小伙伴们赶紧拍砖啦~~~

Android动画之旅-Android动画基本介绍的更多相关文章

  1. 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  2. 我的Android进阶之旅------>Android中查看应用签名信息

    一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...

  3. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...

  4. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...

  5. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)

    对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游 ...

  6. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之开发游戏界面(二)

    连连看的游戏界面十分简单,大致可以分为两个区域: 游戏主界面区 控制按钮和数据显示区 1.开发界面布局 本程序使用一个RelativeLayout作为整体的界面布局元素,界面布局上面是一个自定义组件, ...

  7. 我的Android进阶之旅------>Android利用Sensor(传感器)实现水平仪功能的小例

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端.    利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我 ...

  8. 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法

    我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...

  9. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  10. 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

随机推荐

  1. python 字符串,数学之间的不可描述的关系

    首先说一下输入: >>> a=raw_input(" ") 1.234 >>> a '1.234' >>> 可以看到使用raw ...

  2. 利用FusionCharts制作统计报表

    今天在开发中需要用到统计报表,于是就查找了一下FusionCharts的用法,下面来总结一下利用FusionCharts怎么制作统计报表 1.建表 首先要建立所要统计报表的表,表的字段越多,统计的维度 ...

  3. [P2526][SHOI2001]小狗散步

    Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能 ...

  4. [BZOJ2595]游览计划

    斯坦纳树居然不是数据结构... 斯坦纳树应该是类似最小生成树的问题,只不过它允许增加额外的点 比如这道题就是找关于景点的最小生成树,但还要付出最小的代价,加一些额外的格子把景点都连起来 套路是设$f_ ...

  5. 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器

    说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...

  6. (疯狂java)第二课

    (本文章只是为了好玩,没有别的意思,有理解错误之处,恳请提醒,谢谢) 三.数据类型和运算符 想了一下今天看的内容好像依然大脑停留在用C语言去理解java,感觉有点奇怪,为啥本章叫数据类型和运算符,上来 ...

  7. .net 程式進階除錯教學 - 使用WinDbg

     https://caryhsu.blogspot.com/2011/11/net-windbg.html         從以前一直研究基金方面的資訊,但由於沒有多於的時間常常觀看,再加上碩士時在我 ...

  8. Android显示GIF动画 GifView

    android中显示gif动画原生态一般支持的不是很好,故找了一个开源的项目,现简单介绍如下: GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediapla ...

  9. this和$(this)的关系

    环境关键字this引用的是DOM元素 $(this)是jQuery对象 下面点击按钮分别alert一下 alert(this); alert($(this)); 获取DOM对象的属性id,可以 $(t ...

  10. H5 manifest离线缓存

    请跳转我的有道云笔记查看: http://note.youdao.com/noteshare?id=caaf067c6e38820ba8f87b212c2327a9&sub=23E0F8F7A ...