先来说说什么是逐帧动画,逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。
评价
优势就是动画细腻灵活,缺点
在Android中逐帧动画需要得到AnimationDrawable类的支持,是Drawable的间接子类。它主要用来创建一个逐帧动画,并且可以对帧进行拉伸,把它设置为View的背景即可使用AnimationDrawable.start()方法播放。既然逐帧动画是需要播放一帧一帧的图像,所以需要为其添加帧。在Android中提供了两种方式为AnimationDrawable添加帧:XML定义的资源文件和代码创建,后面再详细讲讲这两种添加帧的方式。
这里我就先介绍一下这个类的方法void start():开始播放逐帧动画。
- void stop():停止播放逐帧动画。
- void addFrame(Drawable frame,int duration):为AnimationDrawable添加一帧,并设置持续时间。
- int getDuration(int i):得到指定index的帧的持续时间。
- Drawable getFrame(int index):得到指定index的帧Drawable。
- int getNumberOfFrames():得到当前AnimationDrawable的所有帧数量
- boolean isOneShot():当前AnimationDrawable是否执行一次,返回true执行一次,false循环播放。
- boolean isRunning():当前AnimationDrawable是否正在播放。
- void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放 (注意这里默认是false)
好了下面给大家说下添加桢的两种方法
一种是xml文件
1 <?xml version="1.0" encoding="utf-8"?>
2 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" >
3 <!-- 定义一个动画帧,Drawable为img0,持续时间50毫秒 -->
4 <item android:drawable="@drawable/img0" android:duration="50" />
5 </animation-list>
另一种代码
frameAnim =new AnimationDrawable();
// 为AnimationDrawable添加动画帧 第一个参数是图片资源,第二个是持续时间 frameAnim.addFrame(getResources().getDrawable(R.drawable.img0), 50);
给个测试代码
public class DongHuaActivity extends AppCompatActivity {
private Button btn_click;
private ImageView btn_donghua;
private AnimationDrawable animaition;
boolean flag=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dong_hua);
btn_donghua= (ImageView) findViewById(R.id.btn_donghua);
btn_donghua.setBackgroundResource(R.drawable.anim_hujiao);
animaition = (AnimationDrawable)btn_donghua.getBackground();
animaition.setOneShot(true);
btn_donghua.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (flag){
start();
flag=false;
}else {
stop();
flag=true;
}
}
});
btn_click= (Button) findViewById(R.id.btn_click);
btn_click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ImageButtonClickUtils.setClickState(btn_click,R.mipmap.img_home,R.mipmap.img_home1);
}
});
}
/**
* 开始播放
*/
protected void start() {
if (animaition != null && !animaition.isRunning()) {
animaition.start();
Toast.makeText(DongHuaActivity.this, "开始播放", 0).show();
Log.i("main", "index 为5的帧持续时间为:"+animaition.getDuration(5)+"毫秒");
Log.i("main", "当前AnimationDrawable一共有"+animaition.getNumberOfFrames()+"帧");
}
}
/**
* 停止播放
*/
protected void stop() {
if (animaition != null && animaition.isRunning()) {
animaition.stop();
Toast.makeText(DongHuaActivity.this, "停止播放", 0).show();
}
}
}
先写这个,其他动画我有空写,我原来写的都没写什么注释
郁闷无奈~~(>_<)~~