前言
逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。
作用对象
视图View(Button,ImageView)
不能作用于View的属性,如长度,背景等
特点
使用简单
但图片过大或者过多会导致OOM
具体使用
1.XML方式
在res/drawable下新建attack.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"
>
<item android:drawable="@drawable/a1" android:duration="100"></item>
<item android:drawable="@drawable/a2" android:duration="100"></item>
<item android:drawable="@drawable/a3" android:duration="100"></item>
<item android:drawable="@drawable/a4" android:duration="100"></item>
<item android:drawable="@drawable/a5" android:duration="100"></item>
<item android:drawable="@drawable/a6" android:duration="100"></item>
<item android:drawable="@drawable/a7" android:duration="100"></item>
<item android:drawable="@drawable/a8" android:duration="100"></item>
<item android:drawable="@drawable/a9" android:duration="100"></item>
<item android:drawable="@drawable/a10" android:duration="100"></item>
<item android:drawable="@drawable/a12" android:duration="100"></item>
<item android:drawable="@drawable/a14" android:duration="100"></item>
<item android:drawable="@drawable/a15" android:duration="100"></item>
<item android:drawable="@drawable/a16" android:duration="100"></item>
<item android:drawable="@drawable/a17" android:duration="100"></item>
<item android:drawable="@drawable/a18" android:duration="100"></item>
<item android:drawable="@drawable/a19" android:duration="100"></item>
<item android:drawable="@drawable/a20" android:duration="100"></item>
<item android:drawable="@drawable/a21" android:duration="100"></item>
<item android:drawable="@drawable/a22" android:duration="100"></item>
<item android:drawable="@drawable/a23" android:duration="100"></item>
<item android:drawable="@drawable/a24" android:duration="100"></item>
<item android:drawable="@drawable/a25" android:duration="100"></item>
</animation-list>
android:oneshot="false" 是否只执行一次
drawable="int":图片资源id
android:duration="long" 时长
MainActivity.java:
package com.zhqy.frameanimdemo;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Switch;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
ImageView iv;
Button btn_start;
Button btn_stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=findViewById(R.id.iv);
btn_start=findViewById(R.id.btn_start);
btn_stop=findViewById(R.id.btn_stop);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_start:
//设置图片资源
iv.setImageResource(R.drawable.attack);
//获取动画对象
AnimationDrawable start = (AnimationDrawable) iv.getDrawable();
//开启
start.start();
break;
case R.id.btn_stop:
//获取动画对象
AnimationDrawable stop = (AnimationDrawable) iv.getDrawable();
//关闭动画
stop.stop();
break;
}
}
}
测试结果

2.代码方式
package com.zhqy.frameanimdemo;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Switch;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
ImageView iv;
Button btn_start;
Button btn_stop;
AnimationDrawable animationDrawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=findViewById(R.id.iv);
btn_start=findViewById(R.id.btn_start);
btn_stop=findViewById(R.id.btn_stop);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
<-- 直接从drawable文件夹获取动画资源(图片) -->
animationDrawable=new AnimationDrawable();
for (int i=1;i<6;i++){
int id = getResources().getIdentifier("b" + i, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable,100);
}
animationDrawable.setOneShot(false);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_start:
//设置图片资源
iv.setImageDrawable(animationDrawable);
//关闭动画,防止第一次动画结束后停留在最后一张
animationDrawable.stop();
//开启动画
animationDrawable.start();
break;
case R.id.btn_stop:
//只播放一次
animationDrawable.setOneShot(true);
//设置图片资源
iv.setImageDrawable(animationDrawable);
//关闭动画
animationDrawable.stop();
break;
}
}
}
测试结果

以上就是逐帧动画的全部内容
网友评论