通过前一篇文章的分析,我们知道在使用Animator的时候,会为你传入的参数值设定一个time fraction,这个time fraction是根据参数平分的,具体可以参考KeyframeSet赋值的那一部分。每一个参数值在到达对应的时间点的时候,其动画值都会达到该参数值,也就会出现拐点,我们可以利用这种表现,来实现不同的动画效果。

对于Translate,Alpha,Scale,Rotate这几种动画的一些属性的使用这里具体说明下,旋转和渐变就一笔带过,使用很简单。

在Property 动画中,所有的动画属性是相同的,参数值只有ValueFrom 和ValueTo的概念,0则表示目标位置(TargetView布局时的位置)。某一方向的动画是直接通过动画名称来标注的。比如Translate动画分为 TranslateX和TranslateY。直接标明是X和Y轴的动画:

参数中的0表示目标位置。之前的一系列赋值都是动画值,最后一个通常设置为0,表示动画结束时Target到达布局中设置的位置。

##Translate##
对应的属性名为TranslateX和TranslateY

TranslateX:参考轴为Y轴
如果value < 0 则位于Y轴的左侧。
如果value > 0 则位于Y轴的右侧。

TranslateY:参考轴为X轴
如果value < 0 则位于X轴的下方。
如果value > 0 则位于X轴的上方。

##Scale##
对应的属性名为 ScaleX、ScaleY
android:pivotX
android:pivotY
value 为缩放比例

##Rotate:对于的属性名为rotation##
android:pivotX 旋转中心X坐标
android:pivotY 旋转中心Y坐标
rotation: value 为旋转角度
value > 0 在参考位置的顺时针方向
value < 0 在参考位置的逆时针方向
如果不设置privotX和privotY,默认是Target的中心为缩放坐标

ObjectAnimator.ofFloat(target, “rotation”, -90, 0),
ObjectAnimator.ofFloat(target, “pivotX”, x, x),
ObjectAnimator.ofFloat(target, “pivotY”, y, y)
这里从逆时针方向90度以X和Y为中心坐标,旋转到目标位置
为了整个过程的时序上保持一致。所以这里privotX和privotY与rotation的参数都为2,旋转中心始终不变

##Alpha##
0.0表示完全透明,1.0表示完全不透明,Float值。
这个动画比较简单,只是使用的时候,参数值的设置,可以达到不同的效果。
比如Bling Bling的效果:
ObjectAnimator.ofFloat(target,”alpha”,1,0,1,0,1)

更直观的,通过图示的方式来看一下:

##translateX value < 0 ##

##translateY value > 0 ##

##rotate 90度 - 0度##

如果你希望在不同值之间会有一些速率变化的效果,那么就可以考虑使用插值器了。
如果你明白了上述的工作方式,并且想接触更多的动画效果,你可以参考代码家的AndroidViewAnimations 动画库,里面封装了各种样式的动画效果,偷图如下:

以上的动画的编排还算是简单的,如何将多个动画组合在一起,实现酷炫的效果呢?
大家也可以感觉到,现在的APP导航界面越来越多的使用了动画效果,让人觉得眼前一亮,撩起用户的使用欲望。GitHub上有两个演示项目,一个是仿墨迹天气的,一个是仿新浪微博的。之前之所以没有直接介绍,是因为我觉得动画这方面的知识不能说相当重要,但是以后开发中一定少不了。对于这样的知识那就一次性搞懂吧。掌握了动画的原理和使用,就看产品怎么定需求了。

我们来看一下,两种导航页的效果:
注:两个Demo都没有向3.0之前兼容,如果要兼容,使用JakeWharton 大神的NineOldAndroids 即可

https://github.com/kongnanlive/AndroidAnimationDemo
http://v.youku.com/v_show/id_XNzc0MTgxMDg4.html

https://github.com/xyzhang/mojichina

在 kongnanlive Weibo示例中由于整个界面的动画比较多,每一个动画又比较复杂,这里代码的思路是每一个单个的动画使用了PropertyValuesHolder,PropertyValuesHolder,相对于AnimationSet.playTogether来实现更简便,减少了ObjectAnimator的创建。
而最终整个界面的所有动画并发执行的时候,使用AnimatorSet.playTogether(…); 每一个界面使用一个AnimationSet统一管理所有的动画。同时为了及时释放资源,通过onLeft onRight onLeftEnd onRightEnd 来处理动画的状态。

再简单说下:
PropertyValuesHolder含有的工厂方法有ofFloat(String propertyName, float… values)、ofKeyframe(String propertyName, Keyframe… values)等。Keyframe的构造方法为Keyframe(fraction,value),包含了fraction和value。fraction系统会根据上层传入的value个数计算得到。该项目主要使用了上述两个工厂方法,两种方式效果相同,只是ofKeyframe(String propertyName, Keyframe… values)需要自己创建Keyframe,而ofFloat,只需传入值,fraction由系统计算出。
如果有不明白的朋友,可以看下Property Anim详解 中的KeyframeSet.java源码分析部分.

xyzhang 的moji,更简洁些。全部使用的是系统自带的View,看起来更加容易些。
两个项目都是可以作为拓展思路的好项目,大家有空可以研究研究。

kongnanlive:微博:网易孔楠
xyzhang:微博:张兴业TBOW

##GitHub上的一些动画项目:##
这些动画效果,还是比较简单的,使用代码家的AndroidViewAnimations 动画库基本都可实现,只是Target不同而已。所以掌握了原理,动画都是一样的。

https://github.com/pedant/sweet-alert-dialog

https://github.com/sd6352051/NiftyNotification

https://github.com/sd6352051/NiftyDialogEffects

###感受:###
通过完整的分析Android的动画之后,发现写一篇好的博客确实不容易,特别是希望能用浅显的方式和大家讲述的时候,本来自己看的,可以将就,但分享的时候,要以最好的方式呈现给大家,整个原理分析部分也是花了不少时间,总是希望整篇文章更全面、更有逻辑性。不过回过头看,确实收获了很多,也是自己第一篇对某方面知识这么全面和系统的分析。也收获了不少认可,算是成功的吧。
对于动画的原理分析告一段落了。拥有了这些知识,分析动画项目也更容易了,以后会陆续分析一些动画项目,其它形式的动画,比如ViewPager的动画。请大家敬请期待。

GitHub:lightSky
微博: light_sky 爱Android,爱开源,爱分享,爱运动,欢迎交流