逐帧动画学习

作用对象

作用于视图控件(View)

  • AndroidTextView、Button
  • 不可作用于View组件的属性,如颜色、背景、长度等
原理
  • 将动画拆分为 的形式,且定义 每一帧 = 一张图片
  • 本质:按序播放一组预先定义好的图片
具体使用
步骤1:将动画资源(即每张图片资源)放到 drawable文件夹里

这里可以将自己需要的GIF动画,利用GIF分解软件(如GifSplitter)将 GIF分解成一张张图片即可

步骤2:设置 和 启动动画

设置 & 启动 逐帧动画有两种方式:XML / Java代码。

方式一:XML实现
  • 1.在 res/drawable的文件夹里创建动画效果.xml文件

此处路径为res/drawable/frame_anim.xml

  • 2.设置动画资源(也就是准备的图片资源)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true" // 设置是否只播放一次,默认为false
>

// item = 动画图片资源;duration = 设置一帧持续时间(ms)
<item android:drawable="@drawable/test_001" android:duration="1000"/>
<item android:drawable="@drawable/test_002" android:duration="1000"/>
<item android:drawable="@drawable/test_003" android:duration="1000"/>
<item android:drawable="@drawable/test_004" android:duration="1000"/>
<item android:drawable="@drawable/test_005" android:duration="1000"/>
<item android:drawable="@drawable/test_006" android:duration="1000"/>
</animation-list>
  • 3.在java代码中载入和启动动画
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MainActivity extends AppCompatActivity {

private Button startFrame,stopFrame;
private ImageView iv;
private AnimationDrawable animationDrawable;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

startFrame = findViewById(R.id.startFrame);
stopFrame = findViewById(R.id.stopFrame);
iv = findViewById(R.id.iv);
//设置动画
iv.setImageResource(R.drawable.frame_anim);
//获取动画对象
animationDrawable = (AnimationDrawable) iv.getDrawable();


//开始动画
startFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动动画
animationDrawable.start();
}
});

//停止动画
stopFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animationDrawable.stop();
}
});
}
}
方式二:在java代码中实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//获取动画对象
animationDrawable = (AnimationDrawable) iv.getDrawable();

for (int i = 1; i <= 6; i++) {
int id = getResources().getIdentifier("test_00"+i,"drawable",getPackageName());
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable,1000);
}

//开始动画
startFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动动画
animationDrawable.start();
}
});

//停止动画
stopFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animationDrawable.stop();
}
});
}
说明

使用时一定要避免使用尺寸较大的图片,否则会引起OOM。

0%