Android--逐帧动画FrameAnimation

先来说说什么是逐帧动画,逐帧动画是一种常见的动画形式(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();
        }
    }
}

先写这个,其他动画我有空写,我原来写的都没写什么注释
郁闷无奈~~(>_<)~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值