职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 600|回复: 11

android Frame动画概述+示例

  [复制链接]
天上智喜 发表于 2011-8-1 10:23 | 显示全部楼层 |阅读模式
     大家平时见到的最多的可能就是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);   
    }   
}  

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;   
    }   
}  

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吧。

broken 发表于 2011-8-1 10:23 | 显示全部楼层
先顶楼主再下代码研究
辛苦了

话说我当年 发表于 2011-8-1 10:23 | 显示全部楼层
pansonphy
先顶楼主再下代码研究
辛苦了

谢谢捧场,呵呵~

叫我小乖 发表于 2011-8-1 10:23 | 显示全部楼层
图文并茂!
带实例程序!
   注释详细!

就两字:
    给力!

希望还能看到更多的。。。。。。。。。。。。。

yoyo 发表于 2011-8-1 10:24 | 显示全部楼层
我运行后黑屏……郁闷

只学java 发表于 2011-8-1 10:24 | 显示全部楼层
楼上的,按一下模拟器的向上键就ok了...

已经来了吗 发表于 2011-8-1 10:24 | 显示全部楼层
想不到还能以这种方式看日全食,好

叫我小乖 发表于 2011-8-1 10:24 | 显示全部楼层
marrymyy
想不到还能以这种方式看日全食,好

谢谢分享!回家写写!O(∩_∩)O~

醉倚西风 发表于 2011-8-1 10:24 | 显示全部楼层
写的太罗嗦了,如果是做一个demo的话,根本不需要自定义view。
而且全屏的帧动画也不是这么干的。

broken 发表于 2011-8-1 10:24 | 显示全部楼层
相当的不错 让想起了美剧《HERO》


江南枫 发表于 2011-8-7 11:48 | 显示全部楼层
楼主福如东海,万寿无疆!
北大青鸟 发表于 2011-8-13 11:34 | 显示全部楼层
努力,努力,再努力!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-30 21:42 , Processed in 0.131403 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表