Android动画效果

http://book.51cto.com/art/201204/328247.htm

第9章  Android动画效果

Android系统提供了两种实现动画的方式,一种是补间动画(Tween Animation),另一种是帧动画(Frame Animation)。补间动画可以实现View组件的移动、放大、缩小以及渐变等效果,帧动画则提供了一种逐帧播放图片的动画方式。无论是补间动画还是帧动画,Android均为其进行了封装,提供了非常简单的应用接口。

9.1  Animation类:动画抽象类

Animation类是Android系统的一个动画抽象类,所有其他一些动画类都要继承该类中的实现方法。Animation类主要用于补间动画效果,提供了动画启动、停止、重复、持续时间等方法。Animation类中的方法适用于任何一种补间动画对象。

9.1.1  setDuration方法:设置持续时间

【功能说明】该方法用于设置动画的持续时间,以毫秒为单位。该方法是设置补间动画时间长度的主要方法,使用非常普遍。

【基本语法】public void setDuration (long durationMillis)

其中,参数durationMillis为动画的持续时间,单位为毫秒(ms)。

setDuration方法的示例可以参阅startNow方法中的示例代码。


9.1.2  startNow方法:立刻启动动画

【功能说明】该方法用于启动执行一个动画。该方法是启动执行动画的主要方法,使用时需要先通过setAnimation方法为某一个View对象设置动画。另外,用户在程序中也可以使用View组件的startAnimation方法来启动执行动画。

【基本语法】public void startNow ()

【实例演示】下面通过代码来演示如何设置一个简单的动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     final Animation translateAnimation=new TranslateAnimation(0,200,0,200);                                                                 //移动动画效果  
  11.  
  12.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub  
  17.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  18.             image.setAnimation(translateAnimation);             //设置动画效果  
  19.             translateAnimation.startNow();                      //启动动画  
  20.         }  
  21.     });  
  22. }  
  23. }  

在这段代码中,首先初始化了一个移动的动画效果translateAnimation。然后,在按钮监听器中,通过setDuration方法设置动画持续时间,并为image对象设置动画效果,最后使用startNow方法启动动画效果。读者执行这段代码,点击"执行动画"按钮,可以在手机屏幕上看到如图9.1所示的显示效果。图中所示的图片将沿45 方向向右下角移动。

9.1.3  start方法:启动动画

【功能说明】该方法用于启动执行一个动画。该方法是启动执行动画的另一个主要方法,使用时需要先通过setAnimation方法为某一个View对象设置动画。start方法区别于startNow方法的地方在于,start方法可以用于在getTransformation方法被调用时启动动画。

【基本语法】public void start ()

start方法的执行效果类似于startNow方法,这里不再赘述。


9.1.4  cancel方法:取消动画

【功能说明】该方法用于取消一个动画的执行。该方法是取得一个正在执行中的动画的主要方法。cancel方法和startNow方法结合可以实现对动画执行过程的控制。需要注意的是,通过cancel方法取消的动画,必须使用reset方法或者setAnimation方法重新设置,才可以再次执行动画。

【基本语法】public void cancel ()

【实例演示】下面通过代码来演示如何取消动画效果执行。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,200,0,200);//移动动画效果  
  12.  
  13.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  14.           
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             // TODO Auto-generated method stub  
  18.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  19.             image.setAnimation(translateAnimation);             //设置动画效果  
  20.             translateAnimation.startNow();                      //启动动画  
  21.         }  
  22.     });  
  23.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  24.           
  25.         @Override  
  26.         public void onClick(View v) {  
  27.             // TODO Auto-generated method stub  
  28.             translateAnimation.cancel();                        /
  29. /取消动画执行  
  30.         }  
  31.     });  
  32. }  
  33. }  

在这段代码中,首先初始化了一个移动的动画效果translateAnimation。然后,在第一个按钮监听器中,通过setDuration方法设置动画持续时间,并为image对象设置动画效果,最后使用startNow方法启动动画效果。在第二个按钮监听器中,调用cancel方法取消动画执行。读者执行这段代码,可以在手机屏幕上看到如图9.2所示的显示效果。当点击"执行动画"按钮时,图片开始移动;当点击"停止动画"按钮时,动画被取消,重新返回起始位置。
 
图9.1  启动动画
 
图9.2  取消动画

9.1.5  setRepeatCount方法:设置重复次数

【功能说明】该方法用于设置一个动画效果重复执行的次数。Android系统默认每个动画仅执行一次,通过该方法可以设置动画执行多次。

【基本语法】public void setRepeatCount (int repeatCount)

其中,参数repeatCount为重复执行的次数。如果设置为n,则动画将执行n+1次。

【实例演示】下面通过代码来演示如何连续执行多次动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,200,0,200);                                                                 //移动动画效果  
  12.  
  13.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  14.           
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             // TODO Auto-generated method stub  
  18.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  19.             translateAnimation.setRepeatCount(2);               //设置重复次数  
  20.             image.setAnimation(translateAnimation);             //设置动画效果  
  21.             translateAnimation.startNow();                      //启动动画  
  22.         }  
  23.     });  
  24.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  25.           
  26.         @Override  
  27.         public void onClick(View v) {  
  28.             // TODO Auto-generated method stub  
  29.             translateAnimation.cancel();                        //取消动画执行  
  30.         }  
  31.     });  
  32. }  
  33. }  

在这段代码中,首先初始化了一个移动的动画效果translateAnimation。然后,在第一个按钮监听器中,通过setDuration方法设置动画持续时间,通过setRepeatCount方法设置重复次数,并为image对象设置动画效果,最后使用startNow方法启动动画效果。在第二个按钮监听器中,调用cancel方法取消动画执行。读者执行这段代码,当点击"执行动画"按钮时,将看到动画被重复执行了两次,也就是总共执行了3次动画。

注意:这里设置的是动画重复执行的次数,而不是动画执行的次数。故动画执行的次数为动画重复执行的次数加1。

9.1.6  setFillEnabled方法:使能填充效果

【功能说明】该方法用于使能填充效果。当该方法设置为true时,将执行setFillBefore和setFillAfter方法,否则将忽略setFillBefore和setFillAfter方法。

【基本语法】public void setFillEnabled (boolean fillEnabled)

其中,参数fillEnabled为是否使能填充效果,true表示使能该效果,false表示禁用该效果。

setFillEnabled方法的示例可以参阅setFillBefore方法和setFillAfter方法中的示例代码。

9.1.7  setFillBefore方法:设置起始填充

【功能说明】该方法用于设置一个动画效果执行完毕后,View对象返回到起始的位置。该方法的效果是系统默认的效果。该方法的执行,需要首先通过setFillEnabled方法使能填充效果,否则设置无效。

【基本语法】public void setFillBefore (boolean fillBefore)

其中,参数fillBefore为是否执行起始填充效果,true表示使能该效果,false表示禁用该效果。

【实例演示】下面通过代码来演示如何让View对象在动画执行完毕后回归到起始位置。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,200,0,200);                                                                 //移动动画效果  
  12.  
  13.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  14.           
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             // TODO Auto-generated method stub  
  18.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  19.             translateAnimation.setFillBefore(true);             //回归起始位置  
  20.             translateAnimation.setFillEnabled(true);            //使能填充效果  
  21.             image.setAnimation(translateAnimation);             //设置动画效果  
  22.             translateAnimation.startNow();                      //启动动画  
  23.         }  
  24.     });  
  25.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  26.           
  27.         @Override  
  28.         public void onClick(View v) {  
  29.             // TODO Auto-generated method stub  
  30.             translateAnimation.cancel();                        //取消动画执行  
  31.         }  
  32.     });  
  33. }  
  34. }  
在这段代码中,首先初始化了一个移动的动画效果translateAnimation。然后,在按钮监听器中,通过setDuration方法设置动画持续时间,通过setFillBefore方法使对象回到起始点,并使用setFillEnabled使能填充效果,最后使用startNow方法启动动画效果。读者执行这段代码,当点击"执行动画"按钮时,图片开始移动,当动画结束之后,图片将自动跳回到起始位置,如图9.3所示。

9.1.8  setFillAfter方法:设置终止填充

【功能说明】该方法用于设置一个动画效果执行完毕后,View对象保留在终止的位置。该方法的执行,需要首先通过setFillEnabled方法使能填充效果,否则设置无效。

【基本语法】public void setFillAfter (boolean fillAfter)

其中,参数fillAfter为是否执行终止填充效果,true表示使能该效果,false表示禁用该效果。

【实例演示】下面通过代码来演示如何让View对象在动画执行完毕后保留在终止位置。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,200,0,200);                                                                 //移动动画效果  
  12.  
  13.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  14.           
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             // TODO Auto-generated method stub  
  18.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  19.             translateAnimation.setFillAfter (true);             //保留在终止位置  
  20.             translateAnimation.setFillEnabled(true);            //使能填充效果  
  21.             image.setAnimation(translateAnimation);             //设置动画效果  
  22.             translateAnimation.startNow();                      //启动动画  
  23.         }  
  24.     });  
  25.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  26.           
  27.         @Override  
  28.         public void onClick(View v) {  
  29.             // TODO Auto-generated method stub  
  30.             translateAnimation.cancel();                        //取消动画执行  
  31.         }  
  32.     });  
  33. }  
  34. }  

在这段代码中,首先初始化了一个移动的动画效果translateAnimation。然后,在按钮监听器中,通过setDuration方法设置动画持续时间,通过setFillAfter方法使对象保留在终止点,并使用setFillEnabled使能填充效果,最后使用startNow方法启动动画效果。读者执行这段代码,当点击"执行动画"按钮时,图片开始移动,当动画结束之后,图片将停留在终止位置,如图9.4所示。
 
图9.3  起始填充效果
 
图9.4  终止填充效果

9.1.9  setRepeatMode方法:设置重复模式

【功能说明】该方法用于设置一个动画效果执行的重复模式。Android系统中提供了几种重复模式,其中最主要的便是RESTART模式和REVERSE模式。

【基本语法】public void setRepeatMode (int repeatMode)

其中,参数repeatMode为动画效果的重复模式,常用的取值如下。

RESTART:重新从头开始执行。

REVERSE:反方向执行。

【实例演示】下面通过代码来演示如何更改动画路径的方向。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,200,0,200);                                                                 //移动动画效果  
  12.  
  13.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  14.           
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             // TODO Auto-generated method stub  
  18.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  19.             translateAnimation.setRepeatCount(2);               //设置重复次数  
  20.             translateAnimation.setRepeatMode(Animation.RESTART);    //重新从头执行  
  21.             //translateAnimation.setRepeatMode(Animation.REVERSE);  //反方向执行  
  22.             image.setAnimation(translateAnimation);             //设置动画效果  
  23.             translateAnimation.startNow();                      //启动动画  
  24.         }  
  25.     });  
  26.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  27.           
  28.         @Override  
  29.         public void onClick(View v) {  
  30.             // TODO Auto-generated method stub  
  31.             translateAnimation.cancel();                        //取消动画执行  
  32.         }  
  33.     });  
  34. }  
  35. }  

在这段代码中,首先初始化了一个移动的动画效果translateAnimation。然后,在按钮监听器中,通过setDuration方法设置动画持续时间,通过setRepeatCount方法设置重复次数,通过setRepeatMode设置重复模式,最后使用startNow方法启动动画效果。

如果设置的重复模式为Animation.RESTART,则表示重新从头开始执行。读者执行这段代码,当点击"执行动画"按钮时,图片开始移动,当一次动画执行结束之后,图片将重新从头开始执行,执行效果如图9.5所示。

如果设置的重复模式为Animation.REVERSE,则表示反方向执行。读者执行这段代码,当点击"执行动画"按钮时,图片开始移动,当一次动画执行结束之后,图片将向反方向运动,执行效果如图9.6所示。

 
图9.5  RESTART模式
 
图9.6  REVERSE模式

9.1.10  setStartOffset方法:设置启动时间

【功能说明】该方法用于设置一个动画执行的启动时间,单位为毫秒。系统默认当执行start方法后立刻执行动画,当使用该方法设置后,将延迟一定的时间再启动动画。

【基本语法】public void setStartOffset (long startOffset)

其中,参数startOffset为动画的启动时间,单位为毫秒(ms)。

【实例演示】下面通过代码来演示如何更改动画的启动时间。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,200,0,200);                                                                 //移动动画效果  
  12.  
  13.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  14.           
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             // TODO Auto-generated method stub  
  18.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  19.             translateAnimation.setStartOffset(3000);            //设置启动时间  
  20.             image.setAnimation(translateAnimation);             //设置动画效果  
  21.             translateAnimation.startNow();                      //启动动画  
  22.         }  
  23.     });  
  24.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  25.           
  26.         @Override  
  27.         public void onClick(View v) {  
  28.             // TODO Auto-generated method stub  
  29.             translateAnimation.cancel();                        //取消动画执行  
  30.         }  
  31.     });  
  32. }  
  33. }  

在这段代码中,首先初始化了一个移动的动画效果translateAnimation。然后,在按钮监听器中,通过setDuration方法设置动画的持续时间,通过setStartOffset方法设置动画的启动时间,最后使用startNow方法启动动画效果。读者执行这段代码,当点击"执行动画"按钮时,将等待3秒之后,图片才开始移动。


9.2  TranslateAnimation类:位置变化动画类

TranslateAnimation类是Android系统中的位置变化动画类,用于控制View对象的位置变化,该类继承于Animation类。TranslateAnimation类中的很多方法都与Animation类一致,该类中最常用的方法便是TranslateAnimation构造方法。

【基本语法】public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

参数说明

fromXDelta:位置变化的起始点X坐标。

toXDelta:位置变化的结束点X坐标。

fromYDelta:位置变化的起始点Y坐标。

toYDelta:位置变化的结束点Y坐标。

【实例演示】下面通过代码来演示如何设置一个简单的位置变化动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,300,0,300);                                                                 //位置变化动画效果  
  12.  
  13.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  14.           
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             // TODO Auto-generated method stub  
  18.             translateAnimation.setDuration(3000);               //设置动画持续时间  
  19.             translateAnimation.setRepeatCount(2);               //设置重复次数  
  20.             translateAnimation.setRepeatMode(Animation.REVERSE);    //反方向执行  
  21.             image.setAnimation(translateAnimation);             //设置动画效果  
  22.             translateAnimation.startNow();                      //启动动画  
  23.         }  
  24.     });  
  25.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  26.           
  27.         @Override  
  28.         public void onClick(View v) {  
  29.             // TODO Auto-generated method stub  
  30.             translateAnimation.cancel();                        //取消动画执行  
  31.         }  
  32.     });  
  33. }  
  34. }  

在这段代码中,首先通过TranslateAnimation构造方法创建了一个位置变化的动画对象。然后,在第一个按钮监听器中设置了动画的持续时间、重复次数和重复模式等,然后启动该动画。在第二个按钮监听器中取消该动画。读者运行这段代码,将看到图片沿如图9.7所示的路径往返运动。
 
图9.7  位置变化动画

9.3  RotateAnimation类:旋转变化动画类

RotateAnimation类是Android系统中的旋转变化动画类,用于控制View对象的旋转动作,该类继承于Animation类。RotateAnimation类中的很多方法都与Animation类一致,该类中最常用的方法便是RotateAnimation构造方法。

【基本语法】public RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

参数说明

fromDegrees:旋转的开始角度。

toDegrees:旋转的结束角度。

pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。

pivotXValue:X坐标的伸缩值。

pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。

pivotYValue:Y坐标的伸缩值。

【实例演示】下面通过代码来演示如何设置一个简单的旋转变化动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {           //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);         //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation rotateAnimation = new       
  12.      RotateAnimation(0f,360f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);  
  13.                                                         //设置旋转变化动画对象  
  14.     btn1.setOnClickListener(new View.OnClickListener() {        //设置监听器  
  15.           
  16.         @Override  
  17.         public void onClick(View v) {  
  18.             // TODO Auto-generated method stub  
  19.             rotateAnimation.setDuration(3000);              //持续时间  
  20.             image.setAnimation(rotateAnimation);            //设置动画  
  21.             rotateAnimation.startNow();                 //启动动画  
  22.         }  
  23.     });  
  24.     btn2.setOnClickListener(new View.OnClickListener() {        //设置监听器  
  25.           
  26.         @Override  
  27.         public void onClick(View v) {  
  28.             // TODO Auto-generated method stub  
  29.             rotateAnimation.cancel();                       //取消动画执行  
  30.         }  
  31.     });  
  32. }  
  33. }  

在这段代码中,首先通过RotateAnimation构造方法创建了一个旋转变化的动画对象。然后,在第一个按钮监听器中设置了动画的持续时间,之后启动该动画。在第二个按钮监听器中取消该动画。读者运行这段代码,将看到图片沿如图9.8所示的方向进行旋转。
 
图9.8  旋转变化动画

9.4  ScaleAnimation类:尺寸变化动画类

ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类。ScaleAnimation类中的很多方法都与Animation类一致,该类中最常用的方法便是ScaleAnimation构造方法。

【基本语法】public ScaleAnimation (float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

参数说明

fromX:起始X坐标上的伸缩尺寸。

toX:结束X坐标上的伸缩尺寸。

fromY:起始Y坐标上的伸缩尺寸。

toY:结束Y坐标上的伸缩尺寸。

pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。

pivotXValue:X坐标的伸缩值。

pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。

pivotYValue:Y坐标的伸缩值。

【实例演示】下面通过代码来演示如何设置一个简单的尺寸变化动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {           //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);         //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation scaleAnimationnew   
  12.      ScaleAnimation(0f,1f,0f,1f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);  
  13.                                                         //设置尺寸变化动画对象  
  14.     btn1.setOnClickListener(new View.OnClickListener() {        //设置监听器  
  15.           
  16.         @Override  
  17.         public void onClick(View v) {  
  18.             // TODO Auto-generated method stub  
  19.             scaleAnimation.setDuration(2000);               //动画持续时间  
  20.             image.setAnimation(scaleAnimation);         //设置动画  
  21.             scaleAnimation.startNow();                      //启动动画  
  22.         }  
  23.     });  
  24.     btn2.setOnClickListener(new View.OnClickListener() {        //设置监听器  
  25.           
  26.         @Override  
  27.         public void onClick(View v) {  
  28.             // TODO Auto-generated method stub  
  29.             scaleAnimation.cancel();                        //取消动画执行  
  30.         }  
  31.     });  
  32. }  
  33. }  

在这段代码中,首先通过ScaleAnimation构造方法创建了一个尺寸变化的动画对象。然后,在第一个按钮监听器中设置了动画的持续时间,之后启动该动画。在第二个按钮监听器中取消该动画。读者运行这段代码,将看到图片从小到大逐渐变化,如图9.9所示。最后,图片增大到原始尺寸的时候停止,如图9.10所示。
 
图9.9  尺寸变化动画
 
图9.10  原始尺寸图片

9.5  AlphaAnimation类:透明度变化动画类

AlphaAnimation类是Android系统中的透明度变化动画类,用于控制View对象的透明度变化,该类继承于Animation类。AlphaAnimation类中的很多方法都与Animation类一致,该类中最常用的方法便是AlphaAnimation构造方法。

【基本语法】public AlphaAnimation (float fromAlpha, float toAlpha)

参数说明

fromAlpha:开始时刻的透明度,取值范围0~1。

toAlpha:结束时刻的透明度,取值范围0~1。

【实例演示】下面通过代码来演示如何设置一个简单的渐变透明度动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation alphaAnimation=new AlphaAnimation(0.1f,1.0f);   //设置透明度动画效果  
  12.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub  
  17.             alphaAnimation.setDuration(30000);                  //设置持续时间  
  18.             image.setAnimation(alphaAnimation);             //设置动画  
  19.             alphaAnimation.startNow();                          //启动动画  
  20.         }  
  21.     });  
  22.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  23.           
  24.         @Override  
  25.         public void onClick(View v) {  
  26.             // TODO Auto-generated method stub  
  27.             scaleAnimation.cancel();                            //取消动画执行  
  28.         }  
  29.     });  
  30. }  
  31. }  

在这段代码中,首先通过AlphaAnimation构造方法创建了一个透明度变化的动画对象。然后,在第一个按钮监听器中设置了动画的持续时间,之后启动该动画。在第二个按钮监听器中取消该动画。读者运行这段代码,将看到图片的透明度由浅入深逐渐变化,如图9.11所示。最后,图片变为完全不透明的时候停止,如图9.12所示。
 
图9.11  透明度渐变动画
 
图9.12  图片原始透明度

9.6  AnimationSet类:动画集合类

AnimationSet类是Android系统中的动画集合类,用于控制View对象进行多个动作的组合,该类继承于Animation类。AnimationSet类中的很多方法都与Animation类一致,该类中最常用的方法便是addAnimation方法,该方法用于为动画集合对象添加动画对象。

【基本语法】public void addAnimation (Animation a)

其中,参数a为Animation动画对象,可以是前述任何一种补间动作。

【实例演示】下面通过代码来演示如何设置一个组合动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final Animation translateAnimation=new TranslateAnimation(0,300,0,300);                                                                 //设置位置变化动画  
  12.     final Animation scaleAnimation = new   
  13.      ScaleAnimation(0f,1f,0f,1f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);  
  14.                                                             //设置尺寸变化动画  
  15.     final Animation alphaAnimation=new AlphaAnimation(0.1f,1.0f);   //设置透明度变化动画  
  16.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  17.           
  18.         @Override  
  19.         public void onClick(View v) {  
  20.             // TODO Auto-generated method stub  
  21.             translateAnimation.setDuration(10000);      //设置位置变化动画的持续时间  
  22.             scaleAnimation.setDuration(10000);          //设置尺寸变化动画的持续时间  
  23.             alphaAnimation.setDuration(10000);          //设置透明度渐变动画的持续时间  
  24.             AnimationSet set=new AnimationSet(true);    //创建动画集对象  
  25.             set.addAnimation(translateAnimation);       //添加位置变化动画  
  26.             set.addAnimation(scaleAnimation);           //添加尺寸变化动画  
  27.             set.addAnimation(alphaAnimation);           //添加透明度渐变动画  
  28.             set.setFillAfter(true);                 //停留在最后的位置  
  29.             set.setFillEnabled(true);  
  30.             image.setAnimation(set);                    //设置动画  
  31.             set.startNow();                         //启动动画  
  32.         }  
  33.     });  
  34.     btn2.setOnClickListener(new View.OnClickListener() {    //设置监听器  
  35.           
  36.         @Override  
  37.         public void onClick(View v) {  
  38.             // TODO Auto-generated method stub  
  39.             set.cancel();                               //取消动画执行  
  40.         }  
  41.     });  
  42. }  
  43. }  

在这段代码中,首先构造了位置变化、尺寸变化和透明度变化动画的对象。然后,在第一个按钮监听器中分别设置了动画的持续时间,并通过addAnimation方法添加到动画集中,之后启动该动画。在第二个按钮监听器中取消该动画。读者运行这段代码,将会看到如图9.13所示的显示效果。图片从小到大,由浅入深,从左上角向右下角移动。当动画结束的时候,图片对象将停留在结束点的位置,如图9.14所示。
 
图9.13  组合动画
 
图9.14  最终位置

9.7  AnimationUtils类:动画工具类

AnimationUtils类是Android系统中的动画工具类,提供了控制View对象的一些工具。该类中最常用的方法便是loadAnimation方法,该方法用于加载XML格式的动画配置文件。在Android系统中,除了在代码中设置动画效果外,还可以在XML配置文件中设置动画的组合动作,这种方式适用性更好。

【基本语法】public static Animation loadAnimation (Context context, int id)

参数说明

context:上下文对象。

id:动画配置文件的ID。

【实例演示】下面通过代码来演示如何加载一个XML组合动画效果。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     Animation loadAnimation;                                    //动画对象  
  12.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub                  //加载动画  
  17.             loadAnimation=AnimationUtils.loadAnimation(getApplicationContext(),   
  18.     R.anim.anim);  
  19.             image.setAnimation(loadAnimation);                  //为控件设置动画  
  20.             loadAnimation.setFillAfter(true);                   //停留在结束位置  
  21.             loadAnimation.setFillEnabled(true);  
  22.             loadAnimation.startNow();                           //开始动画  
  23.         }  
  24.     });  
  25.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  26.           
  27.         @Override  
  28.         public void onClick(View v) {  
  29.             // TODO Auto-generated method stub  
  30.             loadAnimation.cancel();                         //取消动画执行  
  31.         }  
  32.     });  
  33. }  
  34. }  

在这段代码中,首先声明了动画对象。然后,在第一个按钮监听器中通过loadAnimation方法加载动画配置文件,并设置了动画的一些特征,最后开始执行动画。在第二个按钮监听器中调用cancel方法取消动画执行。这里用到的动画配置文件如下所示,里面定义了位置移动和旋转的组合动画效果。
 
 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"> 
  3.     <translate android:toXDelta="0" 
  4.             android:toYDelta="300" 
  5.             android:duration="3000"/>   
  6.     <rotate android:fromDegrees="270" 
  7.             android:toDegrees="360" 
  8.             android:pivotX="50%" 
  9.             android:pivotY="50%" 
  10.             android:duration="3000"/>   
  11. </set> 

读者运行这段代码,可以在手机屏幕上看到如图9.15所示的显示效果。图片从起始位置边旋转边移动,最后停留在如图9.16所示的位置。
 
图9.15  加载动画配置文件
 
图9.16  动画最终位置

9.8  AnimationDrawable类:帧动画类

AnimationDrawable类是Android系统中的帧动画类。帧动画方式类似于放电影的原理,是通过顺序播放多张图片来实现动画效果的,图片之间有一定的动作连贯性,这样人眼看来就像对象真正在运动一样。AnimationDrawable类位于android.graphics.drawable软件包中,本节将介绍帧动画类中的主要编程方法。

9.8.1  start方法:开始动画

【功能说明】该方法用于开始动画执行,其是帧动画效果执行的主要方法。

【基本语法】public void start ()

【实例演示】下面通过代码来演示如何实现一个简单的帧动画。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);                 //按钮对象  
  10.     final AnimationDrawable ad=(AnimationDrawable)image.getBackground();    //声明帧动画对象  
  11.     btn1.setOnClickListener(new View.OnClickListener() {                //设置监听器  
  12.           
  13.         @Override  
  14.         public void onClick(View v) {  
  15.             // TODO Auto-generated method stub  
  16.             ad.start();                                         //开始动画  
  17.         }  
  18.     });  
  19. }  
  20. }  

在这段代码中,首先声明了帧动画对象,然后在按钮监听器中直接调用start方法来开始动画执行。为了能够实现动画效果,还需要指定帧动画所需要的图片和动画顺序。这里需要用到如图9.17所示的5张图片。读者也可以自行设置几张图片。然后,新建一个帧动画配置文件,并将其设置为图片控件的背景。帧动画配置文件的内容如下:
 
 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
  3.                 android:oneshot="true"> 
  4.     <item android:drawable="@drawable/p0" android:duration="50"/> 
  5.     <item android:drawable="@drawable/p1" android:duration="50"/> 
  6.     <item android:drawable="@drawable/p2" android:duration="50"/> 
  7.     <item android:drawable="@drawable/p3" android:duration="50"/> 
  8.     <item android:drawable="@drawable/p4" android:duration="50"/> 
  9. </animation-list> 

 
图9.17  帧动画使用的图片
这样,读者执行这段代码,当点击"执行动画"按钮时,将看到这几张图片按照顺序播放的动画效果,如图9.18所示。

9.8.2  stop方法:停止动画

【功能说明】该方法用于停止动画执行,其是帧动画效果停止的主要方法。start方法常和stop方法一起来使用。

【基本语法】public void stop ()

【实例演示】下面通过代码来演示如何实现一个简单的帧动画。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final AnimationDrawable ad=(AnimationDrawable)image.getBackground();    //声明帧动画对象  
  12.     btn1.setOnClickListener(new View.OnClickListener() {                //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub  
  17.             ad.start();                                         //开始动画  
  18.         }  
  19.     });  
  20.     btn2.setOnClickListener(new View.OnClickListener() {                //设置监听器  
  21.           
  22.         @Override  
  23.         public void onClick(View v) {  
  24.             // TODO Auto-generated method stub  
  25.             ad.stop();                                          //停止动画  
  26.         }  
  27.     });  
  28. }  
  29. }  

在这段代码中,首先声明了帧动画对象。然后,在第一个按钮监听器中直接调用start方法来开始动画执行,在第二个按钮监听器中直接调用stop方法来停止动画执行。这样,读者执行这段代码,将在手机屏幕上看到如图9.19所示的显示效果。当点击"执行动画"按钮时,将看到这几张图片按照顺序播放的动画效果;当点击"停止动画"按钮时,动画将停止。
 
图9.18  执行帧动画
 
图9.19  停止帧动画

9.8.3  addFrame方法:添加动画帧

【功能说明】该方法用于为帧动画对象添加动画帧。该方法主要用于动态修改帧动画内容的场合,可以根据需要增加一些动画帧。

【基本语法】public void addFrame (Drawable frame, int duration)

参数说明

frame:动画帧的Drawable对象。

duration:动画帧的持续时间,单位为毫秒。

【实例演示】下面通过代码来演示如何实现一个简单的帧动画。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final AnimationDrawable ad=(AnimationDrawable)image.getBackground();                                                                        //声明帧动画对象  
  12.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub    
  17.             ad.addFrame(getResources().getDrawable(R.drawable.p0), 100);    //添加帧  
  18.             ad.addFrame(getResources().getDrawable(R.drawable.p1), 100);    //添加帧  
  19.             ad.addFrame(getResources().getDrawable(R.drawable.p2), 100);    //添加帧  
  20.             ad.addFrame(getResources().getDrawable(R.drawable.p3), 100);    //添加帧  
  21.             ad.addFrame(getResources().getDrawable(R.drawable.p4), 100);    //添加帧  
  22.             ad.start();                                     //开始动画  
  23.         }  
  24.     });  
  25.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  26.           
  27.         @Override  
  28.         public void onClick(View v) {  
  29.             // TODO Auto-generated method stub  
  30.             ad.stop();                                      //停止动画  
  31.         }  
  32.     });  
  33. }  
  34. }  

在这段代码中,首先声明了帧动画对象。然后,在第一个按钮监听器中使用addFrame方法添加了动画帧,之后直接调用start方法来开始动画执行,在第二个按钮监听器中直接调用stop方法来停止动画执行。这样,读者执行这段代码,当点击"执行动画"按钮时,将看到动画效果执行了两遍。这是因为我们增加的动画帧与原有的动画帧相同,相当于播放了两次。

9.8.4  setOneShot方法:设置播放方式

【功能说明】该方法用于设置帧动画的播放方式,可以是单次播放,也可以是循环播放。在系统默认情况下采用的是单次播放的方式。该方法主要用于循环播放的场合。

【基本语法】public void setOneShot (boolean oneShot)

其中,参数oneShot表示了动画是否执行一次,true表示仅执行一次,false表示无限次循环执行动画效果。

【实例演示】下面通过代码来演示如何实现一个简单的循环播放帧动画。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final AnimationDrawable ad=(AnimationDrawable)image.getBackground();                                                                        //声明帧动画对象  
  12.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub    
  17.             ad.setOneShot(false);                               //循环播放  
  18.             ad.start();                                     //开始动画  
  19.         }  
  20.     });  
  21.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  22.           
  23.         @Override  
  24.         public void onClick(View v) {  
  25.             // TODO Auto-generated method stub  
  26.             ad.stop();                                      //停止动画  
  27.         }  
  28.     });  
  29. }  
  30. }  

在这段代码中,首先声明了帧动画对象。然后,在第一个按钮监听器中使用setOneShot方法设置循环播放,之后直接调用start方法来开始动画执行,在第二个按钮监听器中直接调用stop方法来停止动画执行。这样,读者执行这段代码,当点击"执行动画"按钮时,将看到动画循环播放的效果。

9.8.5  setAlpha方法:设置透明度

【功能说明】该方法用于设置帧动画播放过程中图片的透明度。该方法经常用于一些特效显示效果的场合。

【基本语法】public void setAlpha (int alpha)

其中,参数alpha表示图片的透明度,取值范围为0~255。

【实例演示】下面通过代码来演示如何改变帧动画播放时的透明度。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final AnimationDrawable ad=(AnimationDrawable)image.getBackground();                                                                        //声明帧动画对象  
  12.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub    
  17.             ad.setAlpha(100);                                   //设置透明度  
  18.             ad.start();                                     //开始动画  
  19.         }  
  20.     });  
  21.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  22.           
  23.         @Override  
  24.         public void onClick(View v) {  
  25.             // TODO Auto-generated method stub  
  26.             ad.stop();                                      //停止动画  
  27.         }  
  28.     });  
  29. }  
  30. }  

在这段代码中,首先声明了帧动画对象。然后,在第一个按钮监听器中使用setAlpha方法设置动画播放时的透明度,之后直接调用start方法来开始动画执行,在第二个按钮监听器中直接调用stop方法来停止动画执行。这样,读者执行这段代码,当点击"执行动画"按钮时,将看到淡淡的、带有一定透明度的动画播放效果,如图9.20所示。
 
图9.20  改变透明度

9.8.6  getNumberOfFrames方法:获取帧数

【功能说明】该方法用于获取动画的帧个数,也就是按照顺序播放了几张图片。该方法常常用于获取帧动画对象特性的场合。

【基本语法】public int getNumberOfFrames ()

【实例演示】下面通过代码来演示如何获取帧动画播放帧的个数。

 
 
  1. public class firstActivity extends Activity {  
  2. /** Called when the activity is first created. */  
  3. @Override  
  4. public void onCreate(Bundle savedInstanceState) {               //重载onCreate方法  
  5.     super.onCreate(savedInstanceState);  
  6.     setContentView(R.layout.main);  
  7.  
  8.     final ImageView image=(ImageView)findViewById(R.id.imageView1); //ImageView对象  
  9.     Button btn1=(Button)findViewById(R.id.button1);             //按钮对象  
  10.     Button btn2=(Button)findViewById(R.id.button2);  
  11.     final AnimationDrawable ad=(AnimationDrawable)image.getBackground();                                                                        //声明帧动画对象  
  12.     btn1.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             // TODO Auto-generated method stub    
  17.             int num;  
  18.             ad.start();                                     //开始动画  
  19.             num=ad.getNumberOfFrames();                     //获取帧数  
  20.             Toast.makeText(getApplicationContext(), "当前动画需要播放"+num+"帧",   
  21.                         Toast.LENGTH_LONG).show();                      //显示  
  22.         }  
  23.     });  
  24.     btn2.setOnClickListener(new View.OnClickListener() {            //设置监听器  
  25.           
  26.         @Override  
  27.         public void onClick(View v) {  
  28.             // TODO Auto-generated method stub  
  29.             ad.stop();                                      //停止动画  
  30.         }  
  31.     });  
  32. }  
  33. }  

在这段代码中,首先声明了帧动画对象。然后,在第一个按钮监听器中直接调用start方法来开始动画执行,通过getNumberOfFrames方法获取帧数并显示。在第二个按钮监听器中直接调用stop方法来停止动画执行。这样,读者执行这段代码,当点击"执行动画"按钮时,将看到动画播放,并显示动画的帧数,如图9.21所示。
 
图9.21  获取帧数

9.9  小结

动画技术能够给应用程序带来丰富的特效,增强用户体验。Android系统提供了两种动画实现方式,补间动画(Tween Animation)和帧动画(Frame Animation)。补间动画可以对View对象进行简单的移动、旋转、缩放和渐变等效果,帧动画则提供了传统的逐帧播放图片的动画方式。本章主要介绍了补间动画类和帧动画类中的主要动画编程方法。




  • 3
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值