【Android 开发】帧动画(Frame animation)详解

引言

Android开发里一共有三大动画,分别是帧动画(Frame animation)、补间动画(Tween animation)和属性动画(Property animation),先来介绍一下最简单的动画——帧动画。


内容简概

一、概念及常用方法
二、案例——火焰动画
三、运行效果

具体内容

一、概念及常用方法

(一)概念

我们平时看的电影、动画片其实都是一帧一帧构成的,通俗地讲就是一张图片是一帧,当播放速度足够快,因为人眼"视觉残留"的原因,会让我们造成动画的"错觉"。这里的帧动画也是如此,Android中实现帧动画,一般我们也会使用Drawable。通过xml方式实现常会用到animation-list。

(二)常用方法
animationDrawable 作用
.stop() 停止动画
.start() 开始动画
.isRunning() 判断动画是否正在进行
animation-list 作用
oneshot =false反复循环执行,=true执行一次
duration 图片显示时间长度

二、案例——火焰动画

(一)前期准备
(二)xml方式实现
  1. 创建一个图片文件


  1. 放入所有图片,配置基本属性(播放方式、时间)


    
    
    
    
    
    

  1. 图片文件有了,接着到我们的布局文件:activity_main.xml:



    
  1. 最后是我们的MainActivity.java,这里在这里控制动画的开始以及暂停。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn_start;
    private Button btn_stop;
    private ImageView iv_anim;
    private AnimationDrawable anim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
        anim = (AnimationDrawable) iv_anim.getBackground();
    }

    private void bindViews() {
        btn_start = findViewById(R.id.btn_start);
        btn_stop = findViewById(R.id.btn_stop);
        iv_anim = findViewById(R.id.iv_anim);
        btn_start.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                anim.start();
                break;
            case R.id.btn_stop:
                anim.stop();
                break;
        }
    }
}
(三)代码方式创建

通过xml方式实现最大的弊端就是当图片数量多时,代码量巨大,而且不易修改,而通过代码实现则能优化这一点。

  1. 首先配置布局文件activity_main



    
  1. 然后在MainActivity中完成添加图片、设置播放时间等相关操作。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn_start;
    private Button btn_stop;
    private ImageView iv_anim;
    private AnimationDrawable anim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 1.找到控件
        bindViews();

        // 2. 添加每一帧的动画
        anim = new AnimationDrawable();
        int[] resID = {R.drawable.campfire01,R.drawable.campfire02,R.drawable.campfire03,
                R.drawable.campfire04,R.drawable.campfire05,R.drawable.campfire06,
                R.drawable.campfire07,R.drawable.campfire08,R.drawable.campfire09,
                R.![1574069883075.gif](https://upload-images.jianshu.io/upload_images/18962003-dc22d969220726c8.gif?imageMogr2/auto-orient/strip)
drawable.campfire10,R.drawable.campfire11,R.drawable.campfire12,
                R.drawable.campfire13,R.drawable.campfire14,R.drawable.campfire15,
                R.drawable.campfire16,R.drawable.campfire17};
        for (int id:resID){
            anim.addFrame(getResources().getDrawable(id,null),100);
        }
        // 3. 设置循环播放
        anim.setOneShot(false);
        // 4. 设置ImageView的背景为AnimationDrawable
        iv_anim.setBackground(anim);
    }
    private void bindViews() {
        btn_start = findViewById(R.id.btn_start);
        btn_stop = findViewById(R.id.btn_stop);
        iv_anim = findViewById(R.id.iv_anim);
        btn_start.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                anim.start();
                break;
            case R.id.btn_stop:
                anim.stop();
                break;
        }
    }
}

三、运行效果

通过上面两种方式实现的效果是一样的,动图如下:



后记

用不同方法实现同一种效果可以学到更多,也有助于加深理解。AnimationDrawable还有其他几种运行方式,就不一一展开了,甩个链接→AnimationDrawable运行的几种方式

优点:有非常大的灵活性,表现任何想表现的内容,合于表演很细腻的动画。
弊端:容易引起OOM,就是“内存耗尽”或者卡顿。

你可能感兴趣的:(【Android 开发】帧动画(Frame animation)详解)