Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。
第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似。
在附件里面我会把这两种效果的实例代码上传上来供大家下载,现在贴在方便使用的代码。
Tween动画
Alpha ---- 淡入淡出,Scale ---- 缩放效果,Translate ---- 移动效果,Rotate ---- 旋转
Frame动画
播放一组连续的图片
alpha_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="3000" android:fromAlpha="0.1" android:toAlpha="1.0" /> <!-- 透明度控制动画效果 alpha 浮点型值: fromAlpha 属性为动画起始时透明度 toAlpha 属性为动画结束时透明度 说明: 0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之间的float数据类型的数字 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
scale_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="1500" android:fillAfter="false" android:fromXScale="0.5" android:fromYScale="0.5" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" /> </set> <!-- 尺寸伸缩动画效果 scale 属性:interpolator 指定一个动画的插入器 在我试验过程中,使用android.res.anim中的资源时候发现 有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 浮点型值: fromXScale 属性为动画起始时 X坐标上的伸缩尺寸 toXScale 属性为动画结束时 X坐标上的伸缩尺寸 fromYScale 属性为动画起始时Y坐标上的伸缩尺寸 toYScale 属性为动画结束时Y坐标上的伸缩尺寸 说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 布尔型值: fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用 -->
translate_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定义从左向右进入的动画 --> <translate android:duration="1500" android:fromXDelta="-100%" android:toXDelta="0" /> <!-- <translate android:duration="2000" android:fromXDelta="30" android:fromYDelta="30" android:toXDelta="-80" android:toYDelta="300" /> --> <!-- translate 位置转移动画效果 整型值: fromXDelta 属性为动画起始时 X坐标上的位置 toXDelta 属性为动画结束时 X坐标上的位置 fromYDelta 属性为动画起始时 Y坐标上的位置 toYDelta 属性为动画结束时 Y坐标上的位置 注意: 没有指定fromXType toXType fromYType toYType 时候, 默认是以自己为相对参照物 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
rotate_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:duration="3000" android:fromDegrees="0" android:interpolator="@android:anim/decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="+350" /> <!-- rotate 旋转动画效果 属性:interpolator 指定一个动画的插入器 在我试验过程中,使用android.res.anim中的资源时候发现 有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 浮点数型值: fromDegrees 属性为动画起始时物件的角度 toDegrees 属性为动画结束时物件旋转的角度 可以大于360度 说明: 当角度为负数——表示逆时针旋转 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
Frame动画
播放一组连续的图片
drawable --- drawable_anim.xml
<?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/pq1" android:duration="50"/> <item android:drawable="@drawable/pq2" android:duration="50"/> <item android:drawable="@drawable/pq3" android:duration="50"/> <item android:drawable="@drawable/pq4" android:duration="50"/> <item android:drawable="@drawable/pq5" android:duration="50"/> <item android:drawable="@drawable/pq6" android:duration="50"/> </animation-list>
import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.AnimationUtils; import android.widget.ImageView; public class MainActivity extends Activity implements OnClickListener{ private ImageView imageView,imageView2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.anim_img); imageView2 = (ImageView) findViewById(R.id.anim_draw_img); findViewById(R.id.anim_alpha).setOnClickListener(this); findViewById(R.id.anim_scale).setOnClickListener(this); findViewById(R.id.anim_translate).setOnClickListener(this); findViewById(R.id.anim_rotate).setOnClickListener(this); findViewById(R.id.anim_drawable).setOnClickListener(this); } @Override public void onClick(View arg0) { switch (arg0.getId()) { case R.id.anim_alpha: if(imageView.getVisibility()==View.INVISIBLE){ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.alpha_in)); imageView.setVisibility(View.VISIBLE); }else{ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.alpha_out)); imageView.setVisibility(View.INVISIBLE); } break; case R.id.anim_scale: if(imageView.getVisibility()==View.INVISIBLE){ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.scale_in)); imageView.setVisibility(View.VISIBLE); }else{ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.scale_out)); imageView.setVisibility(View.INVISIBLE); } break; case R.id.anim_translate: if(imageView.getVisibility()==View.INVISIBLE){ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.translate_in)); imageView.setVisibility(View.VISIBLE); }else{ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.translate_out)); imageView.setVisibility(View.INVISIBLE); } break; case R.id.anim_rotate: if(imageView.getVisibility()==View.INVISIBLE){ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.rotate_in)); imageView.setVisibility(View.VISIBLE); }else{ imageView.setAnimation(AnimationUtils .loadAnimation(this, R.anim.rotate_out)); imageView.setVisibility(View.INVISIBLE); } break; case R.id.anim_drawable: imageView2.setBackgroundResource(R.drawable.drawable_anim); AnimationDrawable animationDrawable = (AnimationDrawable) imageView2.getBackground(); // animationDrawable.addFrame(getResources().getDrawable(R.drawable.pq1), 50); // animationDrawable.addFrame(getResources().getDrawable(R.drawable.pq2), 50); // animationDrawable.addFrame(getResources().getDrawable(R.drawable.pq3), 50); animationDrawable.start(); break; default: break; } } }
下面会有一个实例