android的动画总共有两种方式:
(一)帧(Frame)动画
就是多张图片,控制好播放顺序,持续时间,从头到尾的播放,看起来就像是电视电影的画面。
实现方式:
1.新建一个AnimationDrawable对象,把这些图片加载进去。 addFrame第一参数表示要加载的内容,第二参数表示持续时间。
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);
}
2.第二种构造AnimationDrawable
ivAnimView = (ImageView) findViewById(R.id.ivAnimView);
ivAnimView.setBackgroundResource(R.anim.frame_animation);
Object backgroundObject = ivAnimView.getBackground();
animationDrawable = (AnimationDrawable) backgroundObject;
运行一次动画:
animationDrawable.setOneShot(true);//设置循环播放 false表示循环 true表示不循环,仅播放一次
animationDrawable.start();
开始动画:
animationDrawable.setOneShot(false);
animationDrawable.stop();
animationDrawable.start();
停止动画:
animationDrawable.stop();
if (animationDrawable1 != null)
{
animationDrawable1.stop();
}
增加动画:
if (btnAddFrame.isEnabled())
{
animationDrawable1 = (AnimationDrawable) getResources()
.getDrawable(R.anim.frame_animation1);
animationDrawable.addFrame(animationDrawable1, 2000);
btnAddFrame.setEnabled(false);
}
参数详细说明:
表一 |
||
属性[类型] | 功能 | |
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:保持在最下层 |
(二)补间(Tween)动画
如果动画中的图像变换比较有规律时,可以才用自动生成中间图像的方式生成动画,例如图像的移动、旋转、缩放、透明度渐变、正方形变圆形等,这些图像变化过程中的图像都可以根据一定的算法自动生成,我们只需要指定动画的第一帧和最后一帧图像即可,这种自动生成中间图像的动画就是补间动画。
Android SDK提供了4种补间动画效果:移动、缩放、旋转和透明度。如果要实现更复杂的补间动画需要开发人员自己编码。
补间动画文件放在res/anim/资源下。
1.移动动画 TranslateAnimation:
<?xml version="1.0" encoding="utf-8"?><!-- 移动动画 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate android:fromXDelta="0" android:fromYDelta="-100%"
android:toXDelta="0" android:toYDelta="0" android:duration="1000"
android:repeatCount="-1" android:repeatMode="reverse" />
</set>
interpolator:表示动画渲染器(通用)。有三个值accelerate_interpolator(动画加速器)、decelerate_interpolator(动画减速器)、accelerate_decelerate_interpolator(动画加速减速器)。加速器是动画开始速度慢,越到后来速度越快,其它加速器类似理解。
fromXDelta:起始X坐标
fromYDelta:起始Y坐标
toXDelta:目标X坐标
toYDelta:目标Y坐标
duration:动画持续时间(通用) 单位毫秒
repeatCount:动画重复次数(通用) 大于零为次数,-1或infinite为无限次
repeatMode:动画重复模式(通用) restart:正常重复 reverse:方向相反重复
2.旋转动画 RotateAnimation:
<?xml version="1.0" encoding="utf-8"?><!-- 旋转动画 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<rotate android:fromDegrees="0" android:toDegrees="360"
android:pivotX="50%" android:pivotY="50%" android:repeatCount="-1"
android:repeatMode="reverse" android:duration="2000" />
</set>
fromDegrees:开始角度
toDegrees:结束角度
pivotX:表示沿X轴方向旋转的支点位置,如果该值为50%,则支点在沿X轴的中心位置
pivotY:表示沿Y轴方向旋转的支点位置,如果该值为50%,则支点在沿Y轴的中心位置
3.缩放动画 ScaleAnimation:
<?xml version="1.0" encoding="utf-8"?><!-- 缩放动画 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale android:fromXScale="0.2" android:fromYScale="0.2"
android:toXScale="1.0" android:toYScale="1.0" android:pivotX="50%"
android:pivotY="50%" android:duration="1000" android:repeatCount="-1"
android:repeatMode="reverse" />
</set>
fromXScale:起始X方向缩放比例 0.0最小 1.0原大小 2.0两倍大小
fromYScale:起始Y方向缩放比例
toXScale:结束X方向缩放比例
toYScale:结束Y方向缩放比例
4.透明度动画 AlphaAnimation:
<?xml version="1.0" encoding="utf-8"?><!--
透明动画 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="2000" android:repeatCount="-1" android:repeatMode="reverse" />
</set>
fromAlpha:起始透明度 0.0~1.0 0.0完全透明 1.0完全不透明
toAlpha:结束透明度
以上四种动画可以自由组合成需要的动画,如下即图像缩放同时透明度也改变
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale android:fromXScale="0.2" android:fromYScale="0.2"
android:toXScale="1.0" android:toYScale="1.0" android:pivotX="50%"
android:pivotY="50%" android:duration="1000" android:repeatCount="-1"
android:repeatMode="reverse" />
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="2000" android:repeatCount="-1" android:repeatMode="reverse" />
</set>
装载补间动画文件需要使用AnimationUtils.loadAnimation()方法,如下:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.test);
将补间动画应用到控件的方法有两种:
1.view.startAnimation(animation);
2.view.setAnimation(animation);
animation.start();
通过代码设置补间动画:
1.animation.setRepeatCount(Animation.INFINITE);设置循环显示
2.public TranslateAnimation(float fromXDelta , float from toXDelta ,float
fromYDelta , float toYDelta); 移动动画
3.其他三种动画与上面的差不多。
参数详细说明:
表二 |
||
XML节点 | 功能说明 | |
alpha | 渐变透明度动画效果 | |
<alpha android:fromAlpha=”0.1″ android:toAlpha=”1.0″ android:duration=”3000″ /> |
||
fromAlpha | 属性为动画起始时透明度 |
0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之间的float数据类型的数字 |
toAlpha | 属性为动画结束时透明度 |
表三 |
|||
scale | 渐变尺寸伸缩动画效果 | ||
<scale android:interpolator= “@android:anim/accelerate_decelerate_interpolator” android:fromXScale=”0.0″ android:toXScale=”1.4″ android:fromYScale=”0.0″ android:toYScale=”1.4″ android:pivotX=”50%” android:pivotY=”50%” android:fillAfter=”false” android:startOffset=“700” android:duration=”700″ android:repeatCount=”10″ /> |
|||
fromXScale[float] fromYScale[float] | 为动画起始时,X、Y坐标上的伸缩尺寸 | 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 |
|
toXScale [float] toYScale[float] |
为动画结束时,X、Y坐标上的伸缩尺寸 | ||
pivotX[float] pivotY[float] |
为动画相对于物件的X、Y坐标的开始位置 | 属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置 | |
表四 |
|||
translate | 画面转换位置移动动画效果 | ||
<translate android:fromXDelta=”30″ android:toXDelta=”-80″ android:fromYDelta=”30″ android:toYDelta=”300″ android:duration=”2000″ /> |
|||
fromXDelta toXDelta |
为动画、结束起始时 X坐标上的位置 | ||
fromYDelta toYDelta |
为动画、结束起始时 Y坐标上的位置 | ||
表五 |
|||
rotate | 画面转移旋转动画效果 | ||
<rotate android:interpolator=”@android:anim/accelerate_decelerate_interpolator” android:fromDegrees=”0″ android:toDegrees=”+350″ android:pivotX=”50%” android:pivotY=”50%” android:duration=”3000″ /> |
|||
fromDegrees | 为动画起始时物件的角度 | 说明 当角度为负数——表示逆时针旋转 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) |
|
toDegrees | 属性为动画结束时物件旋转的角度 可以大于360度 | ||
pivotX pivotY |
为动画相对于物件的X、Y坐标的开始位 | 说明:以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 |
|