赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android系统的动画效果
Android系统的动画效果

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

1.Animation类:动画抽象类

Animation类是Android系统的一个动画抽象类,所有其他一些动画类都要继承该类中的实现方法。Animation类主要用于Tween Animation效果,提供了动画启动、停止、重复、持续时间等方法。
1)setDuration方法:设置持续时间
该方法用于设置动画的持续时间,以毫秒为单位。该方法是设置Tween Animation时间长度的主要方法。语法格式:
public void setDuration(long durationMillis)
其中,参数durationMillis为动画持续时间,单位是毫秒。
2)startNow方法:立刻启动动画
该方法用于启动执行一个动画。该方法是启动执行动画的主要方法,使用时需要先通过setAnimation方法为某一个View对象设置动画。也可以使用View组件的startAnimation方法来启动执行动画。语法格式:
public void startNow()
示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
final Animation translateAnimation=new TranslateAnimation(0,200,0,200);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.setDuration(3000);
image.setAnimation(translateAnimation);
translateAnimation.startNow();
}
});
}
}
3)start方法:启动动画
该方法用于启动执行一个动画。该方法是启动执行动画的另一个主要方法,使用时需要先通过setAnimation方法为某一个View对象设置动画。start方法可以用于在getTransformation方法被调用时启动动画。语法格式:
public void start()
4)cancel方法:取消动画
该方法用于取消一个动画的执行。该方法是取得一个正在执行中的动画的主要方法。cancel方法和startNow方法结合可以实现对动画执行过程的控制。通过cancel方法取消的动画,必须使用reset方法或者setAnimation方法重新设置,才可以再次执行动画。语法格式:
public void cancel()
5)setRepeatCount方法:设置重复次数
该方法用于设置一个动画效果重复执行的次数。Android系统默认每个动画仅执行一次,通过该方法可以设置动画执行多次。语法格式:
public void setRepeatCount(int repeatCount)
其中,参数repeatCount为重复执行的次数。如果设置为n,则动画将执行n+1次。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation translateAnimation=new TranslateAnimation(0,200,0,200);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.setDuration(3000);
translateAnimation.setRepeatCount(2);
image.setAnimation(translateAnimation);
translateAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.cancel();
}
});
}
}
6)setFillEnabled方法:使能填充效果
该方法用于使能填充效果。当该方法设置为true时,将执行setFillBefore和setFillAfter方法,否则将忽略setFillBefore和setFillAfter方法。语法格式:
public void setFillEnabled(boolean fillEnabled)
其中,参数fillEnabled为是否使能填充效果,true表示使能该效果,false表示禁用该效果。
7)setFillBefore方法:设置起始填充
该方法用于设置一个动画效果执行完毕后,View对象返回到起始的位置。该方法的效果是系统默认的效果。该方法的执行,需要首先通过setFillEnabled方法使能填充效果,否则设置无效。语法格式:
public void setFillBefore(boolean fillBefore)
其中,参数fillBefore为是否执行起始填充效果,true表示使能该效果,false表示禁用该效果。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation translateAnimation=new TranslateAnimation(0,200,0,200);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.setDuration(3000);
translateAnimation.setFillBefore(true);
translateAnimation.setFillEnabled(true);
image.setAnimation(translateAnimation);
translateAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.cancel();
}
});
}
}
8)setFillAfter方法:设置终止填充
该方法用于设置一个动画效果执行完毕后,View对象保留在终止位置。该方法的执行,需要首先通过setFillEnabled方法使能填充效果,否则设置无效。语法格式:
public void setFillAfter(boolean fillAfter)
其中,参数fillAfter为是否执行终止填充效果,true表示使能该效果,false表示禁用该效果。示例:
translateAnimation.setFillAfter(true);
9)setRepeatMode方法:设置重复模式
该方法用于设置一个动画效果执行的重复模式。Android系统提供了几种重复模式,其中最主要的便是RESTART模式和REVERSE模式。语法格式:
public void setRepeatMode(int repeatMode)
其中,参数repeatMode为动画效果的重复模式,常用的取值为:
·RESTART:重新从头开始执行
·REVERSE:反方向执行
示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation translateAnimation=new TranslateAnimation(0,200,0,200);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.setDuration(3000);
translateAnimation.setRepeatCount(2);
translateAnimation.setRepeatMode(Animation.RESTART);
translateAnimation.setRepeatMode(Animation.REVERSE);
image.setAnimation(translateAnimation);
translateAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.cancel();
}
});
}
}
10)setStartOffset方法:设置启动时间
该方法用于设置一个动画执行的启动时间,单位毫秒。系统默认当执行start方法后立刻执行动画,当使用该方法设置后,将延迟一定的时间再启动动画。语法格式:
public void setStartOffset(long startOffset)
其中,参数startOffset为动画的启动时间,单位毫秒。示例:
translateAnimation.setStartOffset(3000);

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坐标。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation translateAnimation=new TranslateAnimation(0,300,0,300);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.setDuration(3000);
translateAnimation.setRepeatCount(2);
translateAnimation.setRepeatMode(Animation.REVERSE);
image.setAnimation(translateAnimation);
translateAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.cancel();
}
});
}
}

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坐标的伸缩值。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation rotateAnimation=new RotateAnimation (0f,360f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
rotateAnimation.setDuration(3000);
image.setAnimation(rotateAnimation);
rotateAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
rotateAnimation.cancel();
}
});
}
}

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坐标的伸缩值。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation scaleAnimation=new ScaleAnimation (0f,1f,0f,1f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
scaleAnimation.setDuration(3000);
image.setAnimation(scaleAnimation);
scaleAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
scaleAnimation.cancel();
}
});
}
}

5.AlphaAnimation类:透明度变化动画类

AlphaAnimation类是Android系统中的透明度变化动画类,用于控制View对象的透明度变化,该类继承于Animation类。AlphaAnimation类中的很多方法都与Animation类一致,最常用的方法是AlphaAnimation构造方法。语法格式:
public AlphaAnimation(float fromAlpha,float toAlpha)
其中,参数fromAlpha为开始时刻的透明度,取值范围0~1;toAlpha为结束时刻的透明度,取值范围0~1。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation alphaAnimation=new AlphaAnimation (0.1f,1.0f);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
alphaAnimation.setDuration(3000);
image.setAnimation(alphaAnimation);
alphaAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
alphaAnimation.cancel();
}
});
}
}

6.AnimationSet类:动画集合类

AnimationSet类是Android系统中的动画集合类,用于控制View对象进行多个动作的组合,该类继承于Animation类。AnimationSet类中的很多方法都与Animation类一致,最常用的方法是addAnimation方法,用于为动画集合对象添加动画对象。语法格式:
public void addAnimation(Animation a)
其中,参数a为Animation动画对象,可以是前述任何一种Tween动作。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final Animation translateAnimation=new TranslateAnimation (0,300,0,300);
final Animation scaleAnimation=new ScaleAnimation (0f,1f,0f,1f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
final Animation alphaAnimation=new AlphaAnimation (0.1f,1.0f);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
translateAnimation.setDuration(10000);
scaleAnimation.setDuration(10000);
alphaAnimation.setDuration(10000);
AnimationsSet set=new AnimationSet(true);
set.addAnimation(translateAnimation);
set.addAnimation(scaleAnimation);
set.addAnimation(alphaAnimation);
set.setFillAfter(true);
set.setFillEnabled(true);
image.setAnimation(set);
set.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
set.cancel();
}
});
}
}

7.AnimationUtils类:动画工具类

AnimationUtils类是Android系统中的动画工具类,提供了控制View对象的一些工具,最常用的方法是loadAnimation方法,该方法用于加载XML格式的动画配置文件。Android系统中,除了在代码中设置动画效果外,还可以在XML配置文件中设置动画的组合动作,这种方式适用性更好。语法格式:
public static Animation loadAnimation(Context context,int id)
其中,参数context为上下文对象;参数id为动画配置文件的Id。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
Animation loadAnimation;
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
loadAnimation=AnimationUtils.loadAnimation(getApplicationContext(),
R.anim.anim);
image.setAnimation(loadAnimation);
loadAnimation.setFillAfter(true);
loadAnimation.setFillEnable(true);
loadAnimation.startNow();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
loadAnimation.cancel();
}
});
}
}
代码中声明了动画对象,其中用到了动画配置文件,里面定义了位置移动和旋转的组合动画效果,代码为:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:toYDelta="0"
android:toYDelta="300"
android:duration="3000" />
<rotate android:fromDegrees="270"
 android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
androud:suration="3000" />
</set>

8.AnimationDrawable类:帧动画类

AnimationDrawable类是Android系统中的帧动画类。帧动画方式类似于放电影的原理,通过顺序播放多张图片来实现动画效果,图片之间有一定的动作连贯性,人眼看来就像真正运动一样。AnimationDrawable类位于android.graphics.drawable软件包中。
1)start方法:开始动画
该方法用于开始动画执行,是帧动画效果执行的主要方法。语法格式:
public void start()
2)stop方法:停止动画
该方法用于停止动画执行,是帧动画效果停止的主要方法。start方法常和stop方法一起来使用。语法格式:
public void stop()
示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final AnimationDrawable ad=(AnimationDrawable)image.getBackground();
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
ad.start();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
ad.stop();
}
});
}
}
代码中声明了帧动画,为了能够实现动画效果,还需要指定所需要的图片和动画顺序,要使用配置文件,代码为:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/p0" android:duration="50" />
<item android:drawable="@drawable/p1" android:duration="50" />
<item android:drawable="@drawable/p2" android:duration="50" />
<item android:drawable="@drawable/p3" android:duration="50" />
<item android:drawable="@drawable/p4" android:duration="50" />
</animation-list>
3)addFrame方法:添加动画帧
该方法用于为帧动画对象添加动画帧。该方法主要用于动态修改帧动画内容的场合,可以根据需要增加一些动画帧。语法格式:
public void addFrame(Drawable frame,int duration)
其中,参数frame为动画帧的Drawable对象;duration为动画帧的持续时间,单位毫秒。示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final AnimationDrawable ad=(AnimationDrawable)image.getBackground();
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
ad.addFrame(getResources().getDrawable(R.drawable.p0),100);
ad.addFrame(getResources().getDrawable(R.drawable.p1),100);
ad.addFrame(getResources().getDrawable(R.drawable.p2),100);
ad.addFrame(getResources().getDrawable(R.drawable.p3),100);
ad.addFrame(getResources().getDrawable(R.drawable.p4),100);
ad.start();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
ad.stop();
}
});
}
}
4)setOneShot方法:设置播放方式
该方法用于设置帧动画的播放方式,可以是单次播放,也可以是循环播放。在系统默认情况下采用的是单次播放的方式。语法格式:
public void setOneShot(boolean oneShot)
其中,参数oneShot表示了动画是否执行一次,true表示仅执行一次,false表示无限次循环执行动画效果。
5)setAlpha方法:设置透明度
该方法用于设置帧动画播放过程中图片的透明度。语法格式:
public void setAlpha(int alpha)
其中,参数alpha表示图片的透明度,取值范围为0~255。
6)getNumberOfFrames方法:获取帧数
该方法用于获取动画的帧个数,也就是按照顺序播放了几张图片。语法格式:
public int getNumberOfFrames()
示例:
public class firstActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
final AnimationDrawable ad=(AnimationDrawable)image.getBackground();
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
int num;
ad.start();
num=ad.getNumberOfFrames();
Toast.makeText(getApplicationContext(),"当前动画需要播放"+num+"帧",
Toast.LENGTH_LONG).show();
}
});
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
ad.stop();
}
});
}
}

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659