在上一篇博客中。我们简单了解了在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. java 中的try catch在文件相关操作的使用

    import java.io.CharConversionException; import java.io.FileNotFoundException; import java.io.FileRea ...

  2. Java流(一)

    流: 概念:Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存中,形成了流,然后将这些流还可 以写到另外的目的地(文 ...

  3. 循序渐进PYTHON3(十三) --2-- DJANGO之FORM表单(自动生成HTML标签和自定制提示信息)

    在上一次的代码上做出进一步修改,使之能在页面上显示自定制的报错信息,并且使用form自动创建标签的功能. views.py from django.shortcuts import render,Ht ...

  4. zookeeper,hadoop安装部署其实与防火墙无关

    网上查看了很多人关于hadoop,zookeeper的文章,大多都把关闭防火墙作为首要前提,个人觉得这大可不必. 首先你需要知道你部署的是什么东西,它需要哪些端口即可.把相关端口打开就可以了啊.然后把 ...

  5. 洛谷——P3414 SAC#1 - 组合数

    P3414 SAC#1 - 组合数 题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣 ...

  6. [Atcoder Regular Contest 061] Tutorial

    Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ...

  7. [BZOJ 2298] Problem A

    Link: BZOJ 2298 传送门 Solution: 可以将每个人的话转化为$[l[i],r[i]]$的人得分相同 用$map$记录认为$[i,j]$相同的人数,$pos[i][j]$记录以$i ...

  8. 关于网络流sap算法

    今天终于学习了网络流..之前一直很怕这类问题,个人觉得网络流算是图论里面最难的了.... sap学习下来感觉一般,关于解法都是意识流,细节也是蛮多的.. 我这里先贴一份模版,自已也加了点注释(只是个人 ...

  9. bzoj 4506: [Usaco2016 Jan]Fort Moo

    4506: [Usaco2016 Jan]Fort Moo Description Bessie is building a fort with her friend Elsie. Like any ...

  10. ContOS下部署javaweb项目

    1.jdk安装 下载jdk jdk-7u79-linux-x64.rpm # rpm -ivh jdk-7u79-linux-x64.rpm安装  # rpm -e jdk-7u79-linux-x6 ...