android设置帧动画,【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

图片显示时间长度

二、案例——火焰动画

(一)前期准备

121b8a312244

(二)xml方式实现

创建一个图片文件

121b8a312244

121b8a312244

121b8a312244

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

android:oneshot="false">

android:duration="100"/>

android:duration="100"/>

android:duration="100"/>

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

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">

android:id="@+id/btn_start"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="开始" />

android:id="@+id/btn_stop"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="停止" />

android:id="@+id/iv_anim"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/fire_anim"

android:layout_gravity="center"/>

最后是我们的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方式实现最大的弊端就是当图片数量多时,代码量巨大,而且不易修改,而通过代码实现则能优化这一点。

首先配置布局文件activity_main

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">

android:id="@+id/btn_start"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="开始" />

android:id="@+id/btn_stop"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="停止" />

android:id="@+id/iv_anim"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/fire_anim"

android:layout_gravity="center"/>

然后在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;

}

}

}

三、运行效果

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

121b8a312244

后记

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

优点:有非常大的灵活性,表现任何想表现的内容,合于表演很细腻的动画。

弊端:容易引起OOM,就是“内存耗尽”或者卡顿。