Android属性动画深入分析:让你成为动画牛人
2014-08-26 10:01
316 查看
前言
感谢你阅读本文,我坚信读完本文肯定不会让你失望的。想要做动画牛人?想要精通动画?那么本文所讲的内容都是你必须要掌握的。关于动画,我已经写了两篇博文,但是还是没有将动画描述全面,于是我写了本文,另外,我后面还会再写一篇属性动画的源码分析,通过这四篇博文,你将真正地成为动画牛人。Android动画系列:
android动画简介
Android动画进阶—使用开源动画库nineoldandroids
Android属性动画深入分析:让你成为动画牛人
Android源码分析—属性动画的工作原理
我为什么要写这篇博文?
是分享精神,我对动画从了解到熟悉是经历了一个过程,而这一个过程是要花费时间的,也许是几天,也许是几个小时,总之没有至少若干小时的时间投入,你是无法熟悉动画的全部的。我花了大量时间来弄懂动画的整个逻辑,深知其中的辛苦,所以,我不想大家再像我这样,我想大家能够更快地熟悉并精通动画。通过本文,你将会深入了解Android动画并且从此没有动画再能难得了你。确切来说本文是深入分析属性动画,因为View动画和帧动画的功能有限也比较简单,没有太多值得分析的东西。开篇
像设计模式一样,我们也提出一个问题来引出我们的内容。
问题:
给Button加一个动画,让这个Button的宽度从当前宽度增加到500px。也许你会说,这很简单,用渐变动画就可以搞定,我们可以来试试,你能写出来吗?很快你就会恍然大悟,原来渐变动画根本不支持对宽度进行动画啊,没错,渐变动画只支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha)。当然你用x方向缩放(scaleX)可以让Button在x方向放大,看起来好像是宽度增加了,实际上不是,只是Button被放大了而已,而且由于只在x方向被放大,这个时候Button的背景以及上面的文本都被拉伸了,甚至有可能Button会超出屏幕。下面是效果图
上述效果显然是很差的,而且也不是真正地对宽度做动画,不过,所幸我们还有属性动画,我们用属性动画试试
看demo
?
下面分析下属性动画的原理:
属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据你传递的该熟悉的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终值。总结一下,你对object的属性xxx做动画,如果想让动画生效,要同时满足两个条件:1. object必须要提供setXxx方法,如果动画的时候没有传递初始值,那么还要提供getXxx方法,因为系统要去拿xxx属性的初始值(如果这条不满足,程序直接Crash)
2. object的setXxx对属性xxx所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)
以上条件缺一不可
那么为什么我们对Button的width属性做动画没有效果?这是因为Button内部虽然提供了getWidth和setWidth方法,但是这个setWidth方法并不是改变视图的大小,它是TextView新添加的方法,View是没有这个setWidth方法的,由于Button继承了TextView,所以Button也就有了setWidth方法。下面看一下这个getWidth和setWidth方法的源码:
?
针对上述问题,Google告诉我们有3中解决方法:
1. 给你的对象加上get和set方法,如果你有权限的话
2. 用一个类来包装原始对象,间接为其提供get和set方法
3. 采用ValueAnimator,监听动画过程,自己实现属性的改变
看起来有点抽象,不过不用担心,下面我会一一介绍。
对任何属性做动画
针对上面提出的三种解决方法,这里会给出具体的介绍:
给你的对象加上get和set方法,如果你有权限的话
这个的意思很好理解,如果你有权限的话,加上get和set就搞定了,但是很多时候我们没权限去这么做,比如本文开头所提到的问题,你无法给Button加上一个合乎要求的setWidth方法,因为这是Android SDK内部实现的。这个方法最简单,但是往往是不可行的,这里就不对其进行更多分析了。
用一个类来包装原始对象,间接为其提供get和set方法
这是一个很有用的解决方法,是我最喜欢用的,因为用起来很方便,也很好理解,下面将通过一个具体的例子来介绍它?
ok,效果达到了,真正实现了对宽度做动画。
采用ValueAnimator,监听动画过程,自己实现属性的改变
首先说说啥是ValueAnimator,ValueAnimator本身不作用于任何对象,也就是说直接使用它没有任何动画效果。它可以对一个值做动画,然后我们可以监听其动画过程,在动画过程中修改我们的对象的属性值,这样也就相当于我们的对象做了动画。还是不太明白?没关系,下面用例子说明?
增加宽度(100+200=300)。上述计算过程很简单,其实它就是整型估值器IntEvaluator的内部实现,所有我们不用自己写了,直接用吧。
写在后面的话
到此为止,本文的分析基本完成,有几点是我想再说一下的。1.View动画(渐变动画)的功能是有限的,大家可以尝试使用属性动画
2.为了在各种安卓版本上使用属性动画,你需要采用nineoldandroids,它是GitHub开源项目,jar包和源码都可以在网上下到,如果下不到jar包,我可以发给大家
3.再复杂的动画都是简单动画的合理组合,再加上本文介绍的方法,可以对任何属性作用动画效果,也就是说你几乎可以做出任何动画
4.属性动画中的插值器(Interpolator)和估值器(TypeEvaluator)很重要,它是实现非匀速动画的重要手段,你应该试着搞懂它,最好你还能够自定义它们
5.如果你能把我这个动画系列博文都看一遍并且理解它,我认为你对动画绝对算得上精通,而且我不认为有面试官能够在动画上问倒你
相关文章推荐
- Android属性动画深入分析:让你成为动画牛人
- 动画三 Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人(转载)
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析:让你成为动画牛人
- Android属性动画深入分析