Android动画处理——Tween动画

 通过一个Tween动画(补间动画,学过Flash的人应该很熟悉)实例学习。

首先,关于Tween动画有两种方法可以创建,先看第一种——在Java代码里编辑:

Code:
  1. package com.android.tween;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.drawable.BitmapDrawable;  
  7. import android.view.KeyEvent;  
  8. import android.view.View;  
  9. import android.view.animation.AlphaAnimation;  
  10. import android.view.animation.Animation;  
  11. import android.view.animation.RotateAnimation;  
  12. import android.view.animation.ScaleAnimation;  
  13. import android.view.animation.TranslateAnimation;  
  14.   
  15. public class GameView extends View  
  16. {  
  17.     /* 定义Alpha动画 */  
  18.     private Animation   mAnimationAlpha     = null;  
  19.       
  20.     /* 定义Scale动画 */  
  21.     private Animation   mAnimationScale     = null;  
  22.       
  23.     /* 定义Translate动画 */  
  24.     private Animation   mAnimationTranslate = null;  
  25.       
  26.     /* 定义Rotate动画 */  
  27.     private Animation   mAnimationRotate    = null;  
  28.       
  29.     /* 定义Bitmap对象 */  
  30.     Bitmap              mBitmap             = null;  
  31.       
  32.     public GameView(Context context)  
  33.     {  
  34.         super(context);  
  35.           
  36.         /* 装载资源 */  
  37.         mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.my)).getBitmap();  
  38.     }  
  39.       
  40.     public void onDraw(Canvas canvas)  
  41.     {  
  42.         super.onDraw(canvas);  
  43.           
  44.         /* 绘制图片 */  
  45.         canvas.drawBitmap(mBitmap, 00null);  
  46.     }  
  47.   
  48.     public boolean onKeyUp(int keyCode, KeyEvent event)  
  49.     {  
  50.         switch ( keyCode )  
  51.         {  
  52.         case KeyEvent.KEYCODE_DPAD_UP:  
  53.             /* 创建Alpha动画 */  
  54.             mAnimationAlpha = new AlphaAnimation(0.1f, 1.0f);  
  55.             /* 设置动画的时间 */  
  56.             mAnimationAlpha.setDuration(3000);  
  57.             /* 开始播放动画 */  
  58.             this.startAnimation(mAnimationAlpha);  
  59.             break;  
  60.         case KeyEvent.KEYCODE_DPAD_DOWN:  
  61.             /* 创建Scale动画 */  
  62.             mAnimationScale =new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,  
  63.                                                 Animation.RELATIVE_TO_SELF, 0.5f,   
  64.                                                 Animation.RELATIVE_TO_SELF, 0.5f);  
  65.             /* 设置动画的时间 */  
  66.             mAnimationScale.setDuration(500);  
  67.             /* 开始播放动画 */  
  68.             this.startAnimation(mAnimationScale);  
  69.             break;  
  70.         case KeyEvent.KEYCODE_DPAD_LEFT:  
  71.             /* 创建Translate动画 */  
  72.             mAnimationTranslate = new TranslateAnimation(10100,10100);  
  73.             /* 设置动画的时间 */  
  74.             mAnimationTranslate.setDuration(1000);  
  75.             /* 开始播放动画 */  
  76.             this.startAnimation(mAnimationTranslate);  
  77.             break;  
  78.         case KeyEvent.KEYCODE_DPAD_RIGHT:  
  79.             /* 创建Rotate动画 */  
  80.             mAnimationRotate=new RotateAnimation(0.0f, +360.0f,  
  81.                                                  Animation.RELATIVE_TO_SELF,0.5f,  
  82.                                                  Animation.RELATIVE_TO_SELF, 0.5f);  
  83.             /* 设置动画的时间 */  
  84.             mAnimationRotate.setDuration(1000);  
  85.             /* 开始播放动画 */  
  86.             this.startAnimation(mAnimationRotate);  
  87.             break;  
  88.         }  
  89.         return true;  
  90.     }  
  91. }  

 

mAnimationScale =new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,

Animation.RELATIVE_TO_SELF, 0.5f, 

Animation.RELATIVE_TO_SELF, 0.5f);关于这个构造方法的参数理解,可以利用Eclipse的提示功能一个一个的去理解这几个参数,我这里说一下,Animation.RELATIVE_TO_SELF这个参数是限定后面的参数的参照方式,是相对的还是绝对的,相对父界面,还是相对手机窗口,绝对的话你可以设置具体的数值了!

注意:别以为在GameView这个自定义的View里重写了onKeyUp()这个函数,就以为会自动监听键盘事件了,还必须在主Acitivity(HellloTween.java)里重写onKeyUp()方法,并且调用GameView里面的onKeyUp();这样才能做到监听键盘事件!

 

主Acitivity,HellloTween.java代码:

Code:
  1. package com.android.tween;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.KeyEvent;  
  6.   
  7. public class HellloTween extends Activity  
  8. {         
  9.     private GameView    mGameView;  
  10.     /** Called when the activity is first created. */  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState)  
  13.     {  
  14.         super.onCreate(savedInstanceState);  
  15.           
  16.         mGameView = new GameView(this);  
  17.           
  18.         setContentView(mGameView);  
  19.     }  
  20.       
  21.     public boolean onKeyUp(int keyCode, KeyEvent event)  
  22.     {  
  23.         if ( mGameView == null )  
  24.         {  
  25.             return false;  
  26.         }  
  27.         mGameView.onKeyUp(keyCode,event);  
  28.         return true;  
  29.     }  
  30.     public boolean onKeyDown(int keyCode, KeyEvent event)  
  31.     {  
  32.         if ( mGameView == null )  
  33.         {  
  34.             return false;  
  35.         }  
  36.         if ( keyCode ==  KeyEvent.KEYCODE_BACK)  
  37.         {  
  38.             this.finish();  
  39.             return true;  
  40.         }  
  41.         return super.onKeyDown(keyCode, event);  
  42.     }  
  43. }  

再看第二种——在XML里设置:

先建res/anim文件夹,然后在里面分别建alpha_animation.xml、scale_animation.xml、translate_animation.xml、rotate_animation.xml四个文件(注意:文件的命名有规定的,must contain only [a-z0-9_.]):

alpha_animation.xml

Code:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <alpha  
  4.         android:fromAlpha="0.1"  
  5.         android:toAlpha="1.0"  
  6.         android:duration="2000"  
  7.     />  
  8. </set>  

scale_animation.xml

Code:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <scale  
  4.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
  5.         android:fromXScale="0.0"  
  6.         android:toXScale="1.0"  
  7.         android:fromYScale="0.0"  
  8.         android:toYScale="1.0"  
  9.         android:pivotX="80%"  
  10.         android:pivotY="50"  
  11.         android:fillAfter="true"  
  12.         android:duration="500"  
  13.     />  
  14. </set>  

 

                android:pivotX="80%" 比例,经实验,应该是相对手机屏幕的长宽的比例。

android:pivotY="50" 具体像素

                 当然,这两个参数的具体含义是为了确定缩放时的起点,即图片右下角的位置。以这个位置为起点,然后向左上方向放大。

 

translate_animation.xml

Code:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <translate  
  4.         android:fromXDelta = "10"  
  5.         android:toXDelta = "100"  
  6.         android:fromYDelta = "10"  
  7.         android:toYDelta = "100"  
  8.         android:duration = "1000"  
  9.         />  
  10. </set>  

rotate_animation.xm

Code:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <rotate  
  4.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
  5.         android:fromDegrees="0"  
  6.         android:toDegrees="360"  
  7.         android:pivotX="0"  
  8.         android:pivotY="50%"  
  9.         android:duration="1000"  
  10.         />  
  11. </set>  

android:pivotX="0"

android:pivotY="50%"

这两个属性和上面的基本上差不多,有区别的地方是,这里的作用主要是为了确定旋转的轴心。

GameView.java

Code:
  1. package com.android.myAnimation;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.drawable.BitmapDrawable;  
  7. import android.view.KeyEvent;  
  8. import android.view.View;  
  9. import android.view.animation.Animation;  
  10. import android.view.animation.AnimationUtils;  
  11.   
  12. public class GameView extends View  
  13. {  
  14.     Context mContext = null;  
  15.     private Animation mAnimationAlpha = null;  
  16.     private Animation mAnimationScale = null;  
  17.     private Animation mAnimationTranslate = null;  
  18.     private Animation mAnimationRotate = null;  
  19.     private Bitmap mBitmap = null;  
  20.     public GameView(Context context) {  
  21.         super(context);  
  22.           
  23.         mContext = context;  
  24.         mBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.my)).getBitmap();  
  25.     }  
  26.       
  27.     public void onDraw(Canvas canvas) {  
  28.         super.onDraw(canvas);  
  29.         canvas.drawBitmap(mBitmap, 00null);  
  30.     }  
  31.       
  32.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
  33.         switch(keyCode) {  
  34.             case KeyEvent.KEYCODE_DPAD_UP:  
  35.                 mAnimationAlpha = AnimationUtils.loadAnimation(mContext, R.anim.alpha_animation);  
  36.                 startAnimation(mAnimationAlpha);  
  37.                 break;  
  38.             case KeyEvent.KEYCODE_DPAD_DOWN:  
  39.                 mAnimationScale = AnimationUtils.loadAnimation(mContext, R.anim.scale_animation);  
  40.                 startAnimation(mAnimationScale);  
  41.                 break;  
  42.             case KeyEvent.KEYCODE_DPAD_LEFT:  
  43.                 mAnimationTranslate = AnimationUtils.loadAnimation(mContext, R.anim.translate_animation);  
  44.                 startAnimation(mAnimationTranslate);  
  45.                 break;  
  46.             case KeyEvent.KEYCODE_DPAD_RIGHT:  
  47.                 mAnimationRotate = AnimationUtils.loadAnimation(mContext, R.anim.rotate_animation);  
  48.                 startAnimation(mAnimationRotate);  
  49.                 break;  
  50.         }  
  51.           
  52.         return true;  
  53.     }  
  54. }  

AnimationXML.java(主Activity):

Code:
  1. package com.android.myAnimation;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.KeyEvent;  
  6.   
  7. public class AnimationXML extends Activity {  
  8.     private GameView mGameView = null;  
  9.     /** Called when the activity is first created. */  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.           
  14.         mGameView = new GameView(this);  
  15.           
  16.         setContentView(mGameView);  
  17.     }  
  18.       
  19.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
  20.         if(mGameView == null) {  
  21.             return false;  
  22.         }  
  23.           
  24.         mGameView.onKeyUp(keyCode, event);  
  25.         return true;  
  26.     }  
  27.       
  28.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  29.         if(mGameView == null) {  
  30.             return false;  
  31.         }  
  32.           
  33.         if(keyCode == KeyEvent.KEYCODE_BACK) {  
  34.             this.finish();  
  35.             return true;  
  36.         }  
  37.           
  38.         return super.onKeyDown(keyCode, event);  
  39.     }  
  40. }  

最后看看效果图:

alpha_animation

scale_animation

rotate_animation

translate_animation

关于android:XXX这样的属性含义,很多人不理解,然后就束手无策了,我经常这样去解决:1、顾名思义:用金山词霸去翻译(当然,我的英文很菜,必须借助这个……),意思应该差不多!2、查询API文档:很多人找不到地方,不知道在哪查,我现在截图给大家

你可能感兴趣的:(eclipse,android,null,animation,手机,encoding)