在上一篇博客中。我们简单了解了在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. JS内存管理与垃圾回收

    内存分配 var n = 374; // 为数字分配内存 var s = 'sessionstack'; // 为字符串分配内存 var o = { a: 1, b: null }; // 为对象及其 ...

  2. 计蒜客 UCloud 的安全秘钥(困难)(哈希)

    UCloud 的安全秘钥(困难) 编辑代码 9.53% 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘 ...

  3. Visual Studio找不到adb.exe错误解决

    Visual Studio找不到adb.exe错误解决 错误信息:Cannot find adb.exe in specified SDK path.出现这种情况,是因为没有安装Android SDK ...

  4. JDBC 编程初步

    JDBC 概述 什么是JDBC 是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成,JDBC提供了一种操作数据的标准,JDBC的目标是使Java程序员使用JDBC可以 ...

  5. 【20181019T2】硬币【矩阵快速幂优化DP】

    题面 [错解] 哎\(N \leq 50\)?双向搜索? 切了切-- 等下,好像要求方案数-- 好像搜不了 哎他给\(V_{i} | V_{i+1}\)干嘛? 肯定有用啊 为了体现条件的用处,我在搜下 ...

  6. 【DFS】奇怪的电梯

    奇怪的电梯 题目描述 有一天桐桐做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K:(0≤Ki≤N).电梯只有四 个按钮:开,关,上,下.上下的层 ...

  7. 【动态规划】POJ3280- Cheapest Palindrome

    [题目大意] 给出一个字符串,可以删除或添加一些字符,它们各自会消耗价值.问最少消耗多少价值,可以使得字符串变成回文的. [思路] 事实上删除或添加字符的价值只需要保持较小的那一个.假设当前要将(j, ...

  8. bzoj 1783: [Usaco2010 Jan]Taking Turns

    1783: [Usaco2010 Jan]Taking Turns Description Farmer John has invented a new way of feeding his cows ...

  9. maven打包出现找不到java.lang包的问题

    修改pom文件中的bootclasspth路径为${java.home}/lib/rt.jar;${java.home}/lib/jce.jar windows为分号 linux为冒号

  10. Table 'hd_online' is marked as crashed and should be repaired索引损坏

    myisam 引擎表的索引损坏,解决方法 找到mysql的安装目录的/usr/local/mysql/bin/myisamchk工具,在命令行中输入: myisamchk -c -r /data/db ...