动画

【Android 开发】帧动画(Frame animation

2019-11-18  本文已影响0人  榆野铃爱

引言

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. 放入所有图片,配置基本属性(播放方式、时间)
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <!--oneshot设置反复执行-->
    <!--一个item对应一帧:一张图片-->
    <item android:drawable="@drawable/campfire01"
        android:duration="100"/>
    <item android:drawable="@drawable/campfire02"
        android:duration="100"/>
    <item android:drawable="@drawable/campfire03"
        android:duration="100"/>
    <!--后面图片操作同上,一共17张图片-->
</animation-list>
  1. 图片文件有了,接着到我们的布局文件:activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始" />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止" />

    <ImageView
        android:id="@+id/iv_anim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fire_anim"
        android:layout_gravity="center"/>
</LinearLayout>
  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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:id="@+id/main">

    <Button
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始" />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止" />

    <ImageView
        android:id="@+id/iv_anim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fire_anim"
        android:layout_gravity="center"/>
</LinearLayout>
  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://img.haomeiwen.com/i18962003/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,就是“内存耗尽”或者卡顿。

上一篇下一篇

猜你喜欢

热点阅读