Android动画
动画分三类:View动画,Drawable动画(帧动画),属性动画(Android3.0以上)
View动画
系统预置的View动画,4个类型,1个容器
使用
View动画可以自定义,继承Animation,在对应方法里完成相应的矩阵变换,采用Camera类简化矩阵变换过程
(平时很少用到自定义View动画,知道就行)
属性动画
属性动画常用的有ValueAnimator,ObjectAnimator,AnimatorSet(ObjectAnimator继承自ValueAnimator)
对应的XML标签为<animator>,<objectAnimator>,<set>
属性动画的原理就是不断的调用setXXX方法,还要通过getXXX方法获取初始值,
所以属性动画要求对象的该属性有set,get方法,并且该set,get方法确实在UI上有效
示例代码
ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(imageView, "translationX", 0, 200);
ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(imageView, "translationY", 0, 100,-200,300);
AnimatorSet animatorSet = new AnimatorSet();
// 同时播放
animatorSet.playTogether(objectAnimatorX, objectAnimatorY);
// 动画用时100ms
animatorSet.setDuration(500);
// 开始动画
animatorSet.start();
使用XML格式
AnimatorSet set=AnimatorInflater.loadAnimator(Context,R.anim.XXX);
set.setTarget(mButton);
set.start();
帧动画
<animation-list>
<item>
android:duration 一个frame显示多长时间
帧动画容易引起OOM,不要用过多大尺寸图片
Android动画还可以作用于ViewGroup的子项入场效果和Activity的切换效果
1.ViewGroup子元素入场效果:
<layoutAnimation>XML标签,android:delay设置延迟android:animationOrder设置顺序android:animation设置动画
在ViewGroup的XML标签中用android:layoutAnimation引入
或者使用LayoutAnimationController类实现代码设置
2.Activity切换效果
overridePendingTransition(int enterAnim,int enterAnim)
这个方法在startActivity(Intent)和finish()之后生效,也要写在这两个之后
第一个参数为Activity被打开时的动画,第二个参数为Activity被暂停时的动画
3.Fragment切换效果
FragmentTransaction的setCustomAnimations()方法设置
动画的插值器和估值器
TimeInterpolator时间插值器,根据时间流逝的百分比计算出当前属性值改变的百分比
(也可以用Interpolator,是TimeInterpolator的子接口)
系统预置的有LinearInterpolator线性插值器:匀速动画,AccelerateDecelerateInterpolator加速减速插值器:两头慢中间快,DecelerateInterpolator减速插值器:动画越来越慢
TypeEvaluator类型估值器,根据当前属性改变的百分比来确定具体的属性值
系统预置的有IntEvaluator:针对Int型,FloatEvaluator:针对浮点型和ArgbEvaluator:针对Color属性
我们也可以自定义,继承TimeInterpolator(Interpolator)自定义插值器,继承TypeEvaluator自定义估值器
动画的监听器
AnimatorListener监听动画的开始,结束,取消,重复
(对应的适配器类AnimatorListenerAdapter)
AnimatorUpdateListener监听动画的每一帧变化
属性动画的问题
属性动画的原理就是不断的调用setXXX方法,还要通过getXXX方法获取初始值,
所以属性动画要求对象的该属性有set,get方法,并且该set,get方法确实在UI上有效
如果一个对象的set,get不存在或者无效有以下三种解决办法
1.给对象加上get和set方法
2.用包装类,间距提供get,set方法
3.用ValueAnimator,监听动画过程,自己实现属性的改变
注意事项
1.帧动画容易引起OOM,不要用过多大尺寸图片
2.无限循环的动画记得在Activity退出时及时停止
3.属性动画从Android3.0开始
4.View动画是对View的影像做动画,如果出现一些问题,可以clearAnimation()清除动画再解决问题
5.动画过程中尽量使用dp单位,解决不同屏幕的适配
6.属性动画的点击事件位置在新位置,而View动画的点击事件位置在原位置.
7.动画过程中建议开启硬件加速
参考:Android开发艺术探索