引言
Android开发里一共有三大动画,分别是帧动画(Frame animation)、补间动画(Tween animation)和属性动画(Property animation),先来介绍一下最简单的动画——帧动画。
内容简概
一、概念及常用方法
二、案例——火焰动画
三、运行效果
具体内容
一、概念及常用方法
(一)概念
我们平时看的电影、动画片其实都是一帧一帧构成的,通俗地讲就是一张图片是一帧,当播放速度足够快,因为人眼"视觉残留"的原因,会让我们造成动画的"错觉"。这里的帧动画也是如此,Android中实现帧动画,一般我们也会使用Drawable。通过xml方式实现常会用到animation-list。
(二)常用方法
animationDrawable | 作用 |
---|---|
.stop() | 停止动画 |
.start() | 开始动画 |
.isRunning() | 判断动画是否正在进行 |
animation-list | 作用 |
oneshot | =false反复循环执行,=true执行一次 |
duration | 图片显示时间长度 |
二、案例——火焰动画
(一)前期准备
(二)xml方式实现
- 创建一个图片文件
- 放入所有图片,配置基本属性(播放方式、时间)
<?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>
- 图片文件有了,接着到我们的布局文件: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>
- 最后是我们的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
<?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>
- 然后在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,就是“内存耗尽”或者卡顿。
网友评论