Android动画学习总结
一、Android动画分类:
- View动画:场景里的View不断的做变换(平移、旋转、拉伸、透明度)产生的动画效果;
- 帧动画:按顺序播放一系列图像产生的效果;
- 属性动画:Android3.0开始增加的一种动画效果,通过动态改变View对象的属性值实现。
二、View动画:
View动画分为TranslateAnimation、RotateAnimation、ScaleAnimation、AlphaAnimation四类,每一类都有其各自的属性,具体可以查看官方文档,强烈建议使用XML来定义View动画,简单方便,可读性高,下面说明四类动画在XML中的表现形式:
- TranslateAnimation—
<translate>
- RotateAnimation—
<rotate>
- ScaleAnimation—
<scale>
- AlphaAnimation—
<alpha>
- TranslateAnimation—
下面是View动画的定义://res.anim.customize_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:duration="3000"
android:repeatMode="reverse"
android:fillAfter="true"
android:startOffset="300"
android:shareInterpolator="true">
<translate
android:fromYDelta="100"
android:fromXDelta="100"
android:toYDelta="500"
android:toXDelta="500" />
<rotate
android:fromDegrees="0"
android:toDegrees="90"
android:pivotX="0"
android:pivotY="0" />
<scale
android:duration="300"
android:fromXScale="2.0"
android:fromYScale="2.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:toXScale="1.0"
android:toYScale="1.0" />
<alpha
android:fromAlpha="0"
android:toAlpha="1" />
<set><!--在此定义子动画集--></set>
</set>
除了四类View动画特有属性外,还有几个公用属性:
- android:duration(动画持续时间)
- android:fillAfter(动画结束后是否停留在结束位置,true:结束位置,false:初始位置)
- android:interpolator(动画插值器)
- android:repeatMode(动画重复模式)
- android:startOffset(动画延迟时间,单位:ms,默认300ms)
- android:shareInterpolator(动画集是否共享插值器)
定义好View动画后,下面就是应用动画了:
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.customize_anim);
animation.setAnimationListener(new Animation.AnimationListener() { //监听动画过程
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
imageView.startAnimation(animation);
如上,可以对动画添加监听过程。
自定义View动画过程:
a、继承抽象类Animation,重写initialize()、applyTransformation()方法
b、initialize()进行初始化操作
c、applyTransformation()进行相应的矩阵变换实现动画效果,使用Camera可以简化矩阵变换过程帧动画:
系统提供AnimationDrawable来使用动画,因其是顺序播放一组图片来实现动画,特别消耗内存,并且容易引起OOM,所以不建议使用。View动画特殊使用场景
View动画可以应用于ViewGroup场景,用于控制子控件的出场效果,常见的有ListView和Activity的切换效果等,具体实现在此不做详细说明。
三、属性动画
- 属性动画是Api 11加入的新特性,要想兼容Api 11以下版本,可以使用开源库nineoldandroids实现,该开源库的使用和原生的属性动画的使用完全一致。属性动画不再局限于View的变换,它可以实现任意属性值的变化,进而形成动画效果,常用的类有ObjectAnimation、ValueAnimation、AnimationSet等,其中AnimationSet是动画集合,ObjectAnimation是ValueAnimation的子类,属性动画的简单使用示例:
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"translationY",200);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setRepeatCount(3);
animator.setEvaluator(new IntEvaluator());
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.start();
- 插值器
- 插值器是根据时间流逝的百分比计算出当前属性值改变的百分比,系统提供LinearInterpolator(线性插值器,匀速动画)、AccelerateDecelerateInterpolator(加减速插值器,根据cos()函数实现)、DecelerateAccerateInterpolator(减加速插值器,根据sin()函数实现)、DecelerateInterpolator(减速插值器)等,可以实现自定义插值器,只需实现TimeInterpolator接口或者Interpolator接口即可。
- 估值器
- 类似于插值器,估值器是根据当前属性值改变的百分比计算出改变后的属性值,系统提供IntEvaluator(Int型属性估值器)、FloatEvaluator(Float型属性估值器)、ArgbEvaluator(颜色属性股指器),估值器同样可以自定义,只需实现TypeEvaluator接口。注:插值器和估值器是实现非匀速动画的重要手段。
- 属性动画监听
- 属性动画提供两种类型的监听,分别是AnimatorListener和AnimatorUpdateListener,AnimatorListener被AnimatorListenerAdapter类适配,可以有选择的实现该接口中的方法。AnimatorUpdateListener用于监听动画中的每一帧动画。
属性动画生效的前提条件:在此我们假设对对象A的width属性实施动画效果
- A对象必须提供setWidth()方法,如果应用时未提供初始值,A还需提供getWidth()方法来获取width的初始值
A的setWidth()方法设置的值必须能够通过某种方式反应出来,比如UI的改变等
以上两个条件必须同时满足,典型案例如Button的width,只满足第一个条件,想要详细了解请见Button的源码getWidth()、setWidth();
当条件不满足的解决办法,官方提供如下三种:- 权限允许的情况下,为A加上get和set方法,基本上不被使用,A大多数来自SDK
- 包装A类,为其提供get和set方法,用的比较多,示例如下
- 使用ValueAnimator,监听动画过程
private static class ViewWrapper{
private View mTarget;
public ViewWrapper(View mTarget) {
this.mTarget = mTarget;
}
public int getWidth(){
return mTarget.getLayoutParams().width;
}
public void setWidth(int width){
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
//使用包装类
ViewWrapper viewWrapper = new ViewWrapper(textView3);
ObjectAnimator animator = ObjectAnimator.ofInt(viewWrapper,"width",50,500);
animator.setDuration(5000);
animator.start();
四、文章说明
本篇文章是自己对Android动画的学习总结,为了记忆,也为了后面使用方便,如有不对之处,欢迎阅览者提出,在此感谢任志刚老师的《Android开发艺术探索》