上文介绍了在XML中定义逐帧动画,接下来本文中将介绍在代码中控制逐帧动画的加载和播放,代码如下:
Activity:
package com.lovo.frameanim;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnClickListener {
private Button startBtn;
private Button stopBtn;
private ImageView imageView;
// 定义一个存放所有静态图片的图片数组
private Bitmap[] bitmaps = new Bitmap[25];;
// 声明AnimationDrawable对象
private AnimationDrawable animationDrawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
startBtn = (Button) findViewById(R.id.main_btn_start);
stopBtn = (Button) findViewById(R.id.main_btn_stop);
startBtn.setOnClickListener(this);
stopBtn.setOnClickListener(this);
imageView = (ImageView) findViewById(R.id.main_image);
animationDrawable = new AnimationDrawable();
loadImages();
// 设置动画对象的位置和大小
animationDrawable.setBounds(0, 0, 128, 96);
// 设置动画是否循环播放:true表示不循环,false表示循环
animationDrawable.setOneShot(false);
imageView.setBackgroundDrawable(animationDrawable);
// 若要让启动Activity就开始动画,可以使用下面线程来处理
// 利用Handler的postDelayed方法实现线程处理,这里可以直接操作组件对象
// new Handler().postDelayed(new Runnable() {
// @Override
// public void run() {
// animationDrawable.start();
// }
// }, 500);
}
@Override
public void onClick(View v) {
if (v == startBtn) {
// 启动动画
animationDrawable.start();
}
if (v == stopBtn) {
// 停止动画
animationDrawable.stop();
}
}
/**
* 加载图片
*/
public void loadImages() {
// 加载boy图片
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.boy);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
// 在源图片上根据指定位置和大小截取并创建新的位图
bitmaps[i * 5 + j] = Bitmap.createBitmap(srcBitmap, j * 128,
i * 96, 128, 96);
// 给AnimationDrawable对象添加BitmapDrawable对象
animationDrawable.addFrame(new BitmapDrawable(
bitmaps[i * 5 + j]), 50);
}
}
}
}
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<ImageView
android:id="@+id/main_image"
android:layout_width="128dp"
android:layout_height="96dp"
android:background="@anim/freedom_frame_anim" />
<Button
android:id="@+id/main_btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始动画" />
<Button
android:id="@+id/main_btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止动画" />
</LinearLayout>