昨晚ticky老师讲的是一个Animator的动画实现,我自己也有对Android动画框架的Animation、Animator都有完全的分析,大家可以参考:
虽然我自己有对动画框架的完全分析,但是感觉对Animator的掌握还不够,Animator框架的功能还是比较强大的,现在搞系统层开发,平时也很少用到Animator。好了,我们来看一下我们今天要实现的动画的结果,我的手机不能录屏,没办法制作gif动画,只能看一下最终的图片了:
就是一开始点击动画开始的按钮,然后按钮按照贝塞尔曲线的路径执行,当X轴方向的距离超过一定的值后,按钮自身开始在X轴和Y轴上变形放大,当按钮的动画执行完成后,原本隐藏的三个控制按钮又一个个显示出来,这三个按钮显示的时候,是从下面滑上来的,而且三个按钮依次显示,有一些较强的动画感觉,所有使用到的图片都是自己在网上随意找的,可能外观不好看,我们只是说明原理,这些请大家包涵。
这个小项目中,ticky老师有封装动画参数时,有一个小思想感觉非常好,因为在构造ObjectAnimator对象时候,最后一个参数是可变参数,关于这个可变参数在ObjectAnimator对象构成中的解析过程,可以参考我的博客:Android动画全解析(四)。实际过程中,我们也很有可能随时改变,那么如果我们按照变通的方法去传递参数,那么我们每次要修改一下动画路径,就要同时修改多个地方,这样很不方便,ticky老师为了解决这样的问题,想达成的最终目标就是不管用户怎么样的去改变动画路径,我都可以不变,用户只需要去添加就行了。那这处思路的实现也比较简单,我们给用户提供自己定义好的方法让用户去调,用户每次调的时候,根据传进来的参数封装PathPoint路径对象,然后将它保存在成员变量一个ArrayList集合当中,这样用户随意改,每次改,每次都已经添加到成员变量的集合中了,你最终要传给ObjectAnimator的时候,只需要调用一句path.getPoints().toArray()将集合转换成数组就OK了,确实挺方便!!这种实现虽然小,但确实很精妙!!
整个项目的代码中,估值器PathEvaluator中的逻辑应该比较直白,老师也讲的很清晰了,就是根据不同的type计算出一个目标的x、y坐标点,然后以计算结果为参数构造一个PathPoint对象返回给系统。
MainActivity当中的逻辑基本也是按照我们的动画执行的流程来写的,当开始点击,那么就封装ObjectAnimator对象开始执行动画,同时给动画加上监听器,在监听器中判断,当startBtn按钮在X轴方向上的移动距离超过我们定义的MIN_X_DISTANCE = 200目标值时,那么就再给startBtn按钮加上缩放动画,缩放动画同时应用在X轴和Y轴,然后加上监听器。当缩放动画结束时,又开始执行三个按钮的显示动画,显示前,先将它们的位置下调200,然后每个按钮移动到原位置,X轴和Y轴变化到1,也就是原大小,每个按钮的动画延迟(i * 100)毫秒,这样整个过程就完了。
弄完这个例子,我们算是学习了一下动画框架的一些api,这和我们在github上搜索找到一些炫丽的动画效果肯定是不同的,我们哪怕不懂系统实现的原理,但是我们通过这个小例子会使用动画的api,那么碰到一些更复杂的动画,我们就能够猜想出来它大概的实现原理,这肯定还是有收获的。
好了,希望本博客能给大家带来帮助,谢谢!