Android有着丰富的动画效果,其主分为3种,逐帧动画、补间动画、属性动画,在这里先简单介绍逐帧动画与补间动画的基础使用。
1.逐帧动画
首先,逐帧动画,顾名思义就是将图片一帧帧地显示出来以此来达到动画效果,其本质也是如此:按序播放一组预先定义好的图片,所以要使用逐帧动画我们需要先使用gif分解器分解gif动图得到一组gif动图的帧图片。
设置并启动动画:
这里有2种方式
1.xml方式
(1)在drawable文件夹下创建.xml文件。
(2)设置图片资源
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" //设置是否播放一次 >
<item android:drawable="@drawable/fight1" android:duration="100"/>
<item android:drawable="@drawable/fight2" android:duration="100"/>
<item android:drawable="@drawable/fight3" android:duration="100"/>
<item android:drawable="@drawable/fight4" android:duration="100"/>
<item android:drawable="@drawable/fight5" android:duration="100"/>
<item android:drawable="@drawable/fight6" android:duration="100"/>
<item android:drawable="@drawable/fight7" android:duration="100"/>
<item android:drawable="@drawable/fight8" android:duration="100"/>
<item android:drawable="@drawable/fight9" android:duration="100"/>
<item android:drawable="@drawable/fight10" android:duration="100"/>
<item android:drawable="@drawable/fight11" android:duration="100"/>
<item android:drawable="@drawable/fight12" android:duration="100"/>
<item android:drawable="@drawable/fight13" android:duration="100"/>
<item android:drawable="@drawable/fight14" android:duration="100"/>
<item android:drawable="@drawable/fight15" android:duration="100"/>
<item android:drawable="@drawable/fight16" android:duration="100"/>
<item android:drawable="@drawable/fight17" android:duration="100"/>
</animation-list>
(3)在java代码中载入启动动画
mStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mImageView.setImageResource(R.drawable.attack);
animationDrawable=(AnimationDrawable)mImageView.getDrawable();
animationDrawable.start();
}
});
mStopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mImageView.setImageResource(R.drawable.attack);
animationDrawable=(AnimationDrawable)mImageView.getDrawable();
animationDrawable.stop();
}
});
2.Java代码方式
animationDrawable = new AnimationDrawable();
for (int i = 1; i <= 17; i++)
{
int id = getResources().getIdentifier("fight" + i, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id); animationDrawable.addFrame(drawable, 100);
}
mStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animationDrawable.setOneShot(true);
mImageView.setImageDrawable(animationDrawable); // 获取资源对象 animationDrawable.stop(); // 特别注意:在动画start()之前要先stop(),不然在第一次动画之后会停在最后一帧,这样动画就只会触发一次
animationDrawable.start(); // 启动动画
}
});
mStopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animationDrawable.setOneShot(true);
mImageView.setImageDrawable(animationDrawable);
animationDrawable.stop();
}
});
特点:方便、简单。
缺点:容易引起OOM,因为会使用大量且尺寸较大图片,所以应尽量避免使用大尺寸图片。
2.补间动画
根据不同的动画效果,补间动画分为4种动画:
1.平移动画(translate)
2.缩放动画(scale)
3.旋转动画(rotate)
4.透明动画(alpha)
同样补间动画也有xml和java2种实现方式,下面以平移效果为例。
1.xml方式
(1)创建.xml文件
(2)根据不同的动画效果,设置不同的属性
<?xml version="1.0" encoding="utf-8"?> // 采用<translate /> 标签表示平移动画
<translate xmlns:android="http://schemas.android.com/apk/res/android" // 以下参数是4种动画效果的公共属性,即都有的属性
android:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果
android:startOffset ="1000" // 动画延迟开始时间(ms)
android:fillBefore = “true” // 动画播放完后,视图是否会停留在动画开始的状态,默认为true
android:fillAfter=“false”//动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false android:fillEnabled= “true” // 是否应用fillBefore值,对fillAfter值无影响,默认为true
android:repeatMode= “restart” // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart android:repeatCount = “0” // 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复
android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影响动画的播放速度 // 以下参数是平移动画特有的属性
android:fromXDelta="0" // 视图在水平方向x 移动的起始值
android:toXDelta="500" // 视图在水平方向x 移动的结束值
android:fromYDelta="0" // 视图在竖直方向y 移动的起始值
android:toYDelta="500" // 视图在竖直方向y 移动的结束值 />
(3)在java代码中创建Animation对象实现动画效果
Button mButton = (Button) findViewById(R.id.btn_translate); // 步骤1:创建 需要设置动画的 视图View Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.view_animation); // 步骤2:创建 动画对象 并传入设置的动画效果xml文件
mButton.startAnimation(translateAnimation); // 步骤3:播放动画
2.java代码方式
Animation translateAnimation= new TranslateAnimation(0,500,0,500);
translateAnimation.setDuration(3000);
translateAnimation.setFillBefore(false);
translateAnimation.setFillAfter(true);
translateAnimation.setRepeatMode(2);
translateAnimation.setRepeatCount(1);
mTranslateButton.setAnimation(translateAnimation);
其余的动画效果方式可参考各自的方法参数进行修改,这里就不说明了。
值得一提的是Animation在view被创建时才会执行,也就是说如果我们采用按钮点击事件来设置不同的动画效果时采用setAnimation()赋予view控件动画效果后要刷新一次view,即调用invalidate()才能看到动画效果
mLinearLayout.invalidate();
之后会将到属性动画与弹性动画SpringAnimation。