Android中的动画可以分为三种:View动画、帧动画、属性动画
View动画通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果,是一种渐进式动画,并且View动画支持自定义。
帧动画通过顺序播放一系列图像从而产生动画效果,可以简单理解为图片切换动画,很显然,图片过大就会导致OOM
属性动画通过动态的改变对象的属性从而达到动画效果
自定义View动画需要继承Animation这个类,然后重写它的initialize和applyTransformation方法,在initialize方法中做一些初始化的东西,在applyTransformation中进行相应的矩阵变化,很多时候需要Canvas简化矩阵变化的过程。
帧动画播放使用AnimationDrawable,首先通过XML来定义一个AnimationDrawable,然后将创建的Drawable作为View的背景并通过Drawable来播放。
LayoutAnimation作用于ViewGroup为ViewGroup提供一个动画,这样当他的子元素出场时都会有这种动画效果。常备用在ListView上。
LayoutAnimation的两种使用方式:一种是创建在XML文件中指定layoutAnimation属性,设置资源ID,另一中是在代码中通过LayoutAnimationController来完成。
Activity切换动画效果主要通过overridePendingTransition指定,这个方法必须在startActivity和finish之后才会被调用,因此需要指定时可以通过重写Activity的finish方法,然后在其后指定退出动画,当然也可以通过设置Activity的theme,在style文件中设置动画资源
属性动画是在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。
属性动画中repeatCount为-1时表示无线循环播放
属性动画的插值器和估值器:插值器是指根据时间流逝的百分比来计算出当前属性值改变的百分比,系统内置的有线性插值器、加速减速插值器、减速插值器。估值器是指根据属性值改变的百分比来计算改变后的属性值,系统内置的有针对整形属性,浮点型属性和Color属性。所以估值器依赖于插值器,插值器先根据时间流逝的百分比计算出属性改变的百分比,然后估值器根据插值器获到的属性值改变的百分比计算出改变后的属性值,
属性动画的原理:属性动画要求动画作用的对象提供该属性的set和get方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去调用set方法,注:get方法是在没有传入动画初始值时,JIN底层通过反射去获得对象的属性值。
属性动画生效的两个条件:必须提供属性对应的set方法和对属性所做的改变必须能够通过某种方式反映出来
三种解决任意属性不满足属性动画条件的方法:
1.给你的对象加上get和set方法如果你有权限的话
2.用一个类来包装原始对象,间接为其提供get和set方法
3.采用ValueAnimation,监听动画过程,自己实现属性的改变。
ValueAnimation本身不作用于任何对象,也就是说直接作用于它没有任何动画效果,他可以对一个值做动画效果,然后开发者可以监听其变化过程,在动画修改过程中修改对象所对应的属性值。
使用动画的注意事项:
1.OOM问题,特别是使用帧动画时,图片数量较多且图片较大时
2.内存泄漏,属性动画中的无限循环动画在Activity退出时必须及时停止,否则将导致Activity无法释放从而造成内存泄漏。
3.View动画问题,View动画是对View的影像做动画,并不是真正的改变View的状态,因此有时候会出现动画完成后View无法隐藏的现象,即setVisibility失效,这时候只需要调用view.clearAnimation清楚View动画即可解决该问题。