Frame Animation(逐帧动画)
在Android中,动画Animation的实现有两种方式:Tween Animation(补间动画)和Frame Animation(帧动画)。渐变动画是通过对场景里的对象不断做图像变换(平移、缩放、旋转等)产生动画效果。帧动画则是通过顺序播放事先准备好的图像来产生动画效果,和电影类似。先来说说什么事Frame Animation(逐帧动画)。
逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。 因为逐帧动画的帧序列内容不一样,不但给制作增加了负担而且最终输出的文件量也很大,但它的优势也很明显:逐帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容,而它类似与电影的播放模式,很适合于表演细腻的动画。
需要AnimationDrawable定义好的其他的一些方法来操作逐帧动画,下面简单介绍一下AnimationDrawable的常用方法:
- void start():开始播放逐帧动画
- void stop():停止播放逐帧动画
- void addFrame(Drawable frame,int duration):为AnimationDrawable添加一帧,并设置持续时间
- int getDuration(int i):得到指定index的帧的持续时间
- Drawable getFrame(int index):得到指定index的帧Drawable
- int getNumberOfFrames():得到当前AnimationDrawable的所有帧数量
- boolean isOneShot():当前AnimationDrawable是否执行一次,返回true执行一次,false循环播放
- boolean isRunning():当前AnimationDrawable是否正在播放
- void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放
首先在android的res/drawble下放置一系列用到的图并创建animlist.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/leibao_01"
android:duration="200"/>
<item
android:drawable="@drawable/leibao_02"
android:duration="200" />
<item
android:drawable="@drawable/leibao_03"
android:duration="200" />
<item
android:drawable="@drawable/leibao_04"
android:duration="200" />
<item
android:drawable="@drawable/leibao_05"
android:duration="200" />
<item
android:drawable="@drawable/leibao_06"
android:duration="200" />
<item
android:drawable="@drawable/leibao_07"
android:duration="200"/>
</animation-list>
然后设置图片显示的布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@android:color/white"
tools:context="com.example.admin.frameanimation.AnimationActivity">
<ImageView
android:id="@+id/animation_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/animlist" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BEGIN"
android:textColor="@android:color/black"
android:layout_marginLeft="52dp"
android:layout_marginStart="52dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/begin"/>
<Button
android:id="@+id/end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="END"
android:textColor="@android:color/black"
android:layout_marginRight="42dp"
android:layout_marginEnd="42dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
之后修改AnimationActivity.java中的内容
package com.example.admin.frameanimation;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class AnimationActivity extends Activity implements OnClickListener {
private ImageView imageView;
private Button btnStart, btnStop;
private AnimationDrawable animationDrawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intiView();
initData();
}
/**
*初始化组件
*/
private void intiView() {
imageView = (ImageView) findViewById(R.id.animation_iv);
btnStart = (Button) findViewById(R.id.begin);
btnStop = (Button) findViewById(R.id.end);
}
/**
*初始化数据
*/
private void initData() {
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
//Sets a drawable as the content of this ImageView.
imageView.setImageResource(R.drawable.animlist);
//给动画资源赋值
animationDrawable = (AnimationDrawable) imageView.getDrawable();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.begin:
animationDrawable.start();//开始
break;
case R.id.end:
animationDrawable.stop(); //停止
break;
}
}
}