论坛首页 移动开发技术论坛

android Frame动画概述+示例

浏览 14130 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-03  
    大家平时见到的最多的可能就是Frame动画了,Android中当然也少不了它。它的使用更加简单,只需要创建一个AnimationDrawabledF对象来表示Frame动画,然后通过addFrame 方法把每一帧要显示的内容添加进去,最后通过start 方法就可以播放这个动画了,同时还可以通过 setOneShot方法设置是否重复播放。 下面就是一个用Frame动画模拟日全食的效果。先看看效果。









Activity01
package xiaohang.zhimeng;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.view.WindowManager;

public class Activity01 extends Activity {
	private GameView mGameView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 设置无标题栏
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 设置为全屏模式
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		mGameView = new GameView(this);

		setContentView(mGameView);
	}

	public boolean onKeyUp(int keyCode, KeyEvent event) {
		if (mGameView == null) {
			return false;
		}
		mGameView.onKeyUp(keyCode, event);
		return true;
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (mGameView == null) {
			return false;
		}
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			// 关闭Activity
			this.finish();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}
}


GameView
package xiaohang.zhimeng;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.view.KeyEvent;
import android.view.View;

public class GameView extends View{
	
	//定义AnimationDrawable动画
	private AnimationDrawable	frameAnimation = null;
	Context						mContext 	   = null;
	
	//定义一个Drawable对象
	Drawable					mBitAnimation  = null;
	
	public GameView(Context context) {
		super(context);
		
		mContext = context;
		
		//实例化AnimationDrawable对象
		frameAnimation = new AnimationDrawable();
		
		/*装载资源*/
		//这里用一个循环装载所有名字类似的资源
		//如"a1...........15.png"的图片
		for(int i = 1; i <= 15; i++){
			int id = getResources().getIdentifier("a" + i, "drawable", mContext.getPackageName());
			//此方法返回一个可绘制的对象与特定的资源ID相关联 
			mBitAnimation = getResources().getDrawable(id);
			/*为动画添加一帧*/
			//参数mBitAnimation是该帧的图片
			//参数500是该帧显示的时间,按毫秒计算
			frameAnimation.addFrame(mBitAnimation, 500);
		}
		/*上边用到了Resources的getIdentifier方法 方法返回一个资源的唯一标识符,如果没有这个资源就返回0
		 * 0不是有效的标识符,在说说这个方法几个参数的含义
		 * 第一个 就是我们的资源名称了。
		 * 第二个 就是我们要去哪里找我们的资源 我们的图片在drawable 下 所以为drawable
		 * 第三个 我们用了Context的getPackageName返回应用程序的包名
		 * */
		
		//设置播放模式是否循环播放,false表示循环,true表示不循环
		frameAnimation.setOneShot(false);
		
		//设置本类将要显示的这个动画
		this.setBackgroundDrawable( frameAnimation );
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
	}
	
	public boolean onKeyUp(int keyCode, KeyEvent event){
		switch (keyCode) {
		case KeyEvent.KEYCODE_DPAD_UP:
			//当按手机的上方向键时开始播放
			frameAnimation.start();
			break;
		}
		return true;
	}
}

  
   同样Frame 也可以用xml文件实现,大家去看 api吧。

   源码见附件

  • 大小: 13.7 KB
  • 大小: 15.1 KB
  • 大小: 13.3 KB
  • 大小: 22.8 KB
   发表时间:2010-12-06  
先顶楼主再下代码研究
辛苦了
0 请登录后投票
   发表时间:2010-12-07  
pansonphy 写道
先顶楼主再下代码研究
辛苦了

谢谢捧场,呵呵~
0 请登录后投票
   发表时间:2010-12-08  
图文并茂!
带实例程序!
   注释详细!

就两字:
    给力!

希望还能看到更多的。。。。。。。。。。。。。
0 请登录后投票
   发表时间:2011-01-07  
我运行后黑屏……郁闷
0 请登录后投票
   发表时间:2011-01-18  
楼上的,按一下模拟器的向上键就ok了...
0 请登录后投票
   发表时间:2011-01-26  
想不到还能以这种方式看日全食,好
0 请登录后投票
   发表时间:2011-01-30  
marrymyy 写道
想不到还能以这种方式看日全食,好

谢谢分享!回家写写!O(∩_∩)O~
0 请登录后投票
   发表时间:2011-02-05  
写的太罗嗦了,如果是做一个demo的话,根本不需要自定义view。
而且全屏的帧动画也不是这么干的。
0 请登录后投票
   发表时间:2011-02-07  
相当的不错 让想起了美剧《HERO》
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics