Android提供了两类动画,第一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。第二类就是 Frame动画,即顺序的播放事先做好的图像。
1. Tween动画
主要类:
Animation 动画
AlphaAnimation 渐变透明度
RotateAnimation 画面旋转
ScaleAnimation 渐变尺寸缩放
TranslateAnimation 位置移动
AnimationSet 动画集,让多个动画同时生效。
AnimationUtils 工具类,通过该类来加载xml实现的动画。
(1) AlphaAnimation
代码方式:
Animation alphaAnimation = new AlphaAnimation(0.1f, 1.0f); // 从0.1f变化到1.0f View.startAnimation(alphaAnimation );
xml实现: alpha_anim.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:fromAlpha="0.1" android:toAlpha="1.0" android:duration="2000" /> </set>
alphaAnimation= AnimationUtils.loadAnimation(getContext(), R.anim.alpha_anim);
(2) RotateAnimation
代码实现:
Animation rotateAnimation = new RotateAnimation(0f, 360f); // 0是动画起始时的角度,360f位动画结束时的角度 rotateAnimation.setDuration(1000); this.startAnimation(scaleAnimation);
xml实现: rotate_anim.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" <!--为动画相对于物件的X、Y坐标的开始位置, 50%表示物件的中点位置 --> android:pivotY="50%" android:duration="500" /> </set>
rotateAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.rotate_anim);
(3) ScaleAnimation
代码实现:
//初始化 Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f); // 前面两个参数表示动画起始、结束时X方向的伸缩尺寸,后面两个参数表示动画起始、结束时Y方向的伸缩尺寸。 //设置动画时间 scaleAnimation.setDuration(500); this.startAnimation(scaleAnimation);
xml实现: scanle_anim.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.0" android:fromYScale="0.0" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="500" /> </set>
scaleAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.scanle_anim);
(4) TranslateAnimation
代码实现:
Animation translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f); // 四个参数(x1, x2, y1, y2),表示X方向从x1移动到x2, Y方向从y1移到y2. translateAnimation.setDuration(1000); //设置动画时间 this.startAnimation(translateAnimation);
xml实现: translate_anim.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="10" android:toXDelta="100" android:fromYDelta="10" android:toYDelta="100" /> </set>
translateAnimation= AnimationUtils.loadAnimation(getContext(), R.anim.translate_anim);
(5) 使用AnimationSet, 让多个动画同时生效,如:
//初始化 Translate动画 translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f); //初始化 Alpha动画 alphaAnimation = new AlphaAnimation(0.1f, 1.0f); //动画集 AnimationSet set = new AnimationSet(true); set.addAnimation(translateAnimation); set.addAnimation(alphaAnimation); //设置动画时间 (作用到每个动画) set.setDuration(1000); this.startAnimation(set);
2. Frame动画(FrameAnimaiton)
代码实现过程:
首先创建一个AnimationDrawable对象,通过addFrame方法把每一帧要显示的内容添加进去,最后通过Start方法来播放动画。
frameAnimation = new AnimationDrawable(); for (int i = 0; i < 10; i++) { int id = getResources().getIdentifier("load" + (i+1), "drawable", this.getContext().getPackageName()); frameAnimation.addFrame(getResources().getDrawable(id), 100); } //设置循环播放 false表示循环 true表示不循环,仅播放一次 frameAnimation.setOneShot(false); //应用动画 image.setBackgroundDrawable(anim); anim.start();
xml实现方式: frame_anim.xml
<?xml version="1.0" encoding="utf-8"?> <animaltion-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/load1" android:duration="50" /> <item android:drawable="@drawable/load2" android:duration="50" /> <item android:drawable="@drawable/load3" android:duration="50" /> <item android:drawable="@drawable/load4" android:duration="50" /> <item android:drawable="@drawable/load5" android:duration="50" /> <item android:drawable="@drawable/load6" android:duration="50" /> <item android:drawable="@drawable/load7" android:duration="50" /> <item android:drawable="@drawable/load8" android:duration="50" /> <item android:drawable="@drawable/load9" android:duration="50" /> <item android:drawable="@drawable/load10" android:duration="50" /> </animaltion-list>
应用frame_anim.xml:
image.setBackgroundResource(R.anim.frame); //将动画资源文件设置为ImageView的背景 AnimationDrawable anim = (AnimationDrawable) image.getBackground(); //获取ImageView背景,此时已被编译成AnimationDrawable anim.start(); //开始动画
3. 与动画相关的一些函数及参数说明
表一 |
||
属性[类型] | 功能 | |
Duration[long] | 属性为动画持续时间 | 时间以毫秒为单位 |
fillAfter [boolean] | 当设置为true ,该动画转化在动画结束后被应用 | |
fillBefore[boolean] | 当设置为true ,该动画转化在动画开始前被应用 | |
interpolator |
指定一个动画的插入器 | 有一些常见的插入器 accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 |
repeatCount[int] | 动画的重复次数 | |
RepeatMode[int] | 定义重复的行为 | 1:重新开始 2:plays backward |
startOffset[long] | 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画 | |
zAdjustment[int] | 定义动画的Z Order的改变 | 0:保持Z Order不变 1:保持在最上层 -1:保持在最下层 |