Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果
Frame Animation:顺序播放事先做好的图像,跟电影类似
在使用Animation前,我们先学习如何定义Animation,这对我们使用Animation会有很大的帮助。Animation是以XML格式定义的,定义好的XML文件存放在res\anim中。由于Tween Animation与Frame Animation的定义、使用都有很大的差异,我们将分开介绍,本篇幅中介绍Tween Animation的定义与使用,后续篇幅再详细介绍Frame Animation。按照XML文档的结构【父节点,子节点,属性】来介绍Tween Animation,其由4种类型:
Alpha:渐变透明度动画效果
Scale:渐变尺寸伸缩动画效果
Translate:画面转换位置移动动画效果
Rotate:画面转换位置移动动画效果
在介绍以上4种类型前,先介绍Tween Animation共同的节点属性,关于节点的命名原则,请阅读AndroidManifest.xml文件结构说明。
表一
属性[类型]
功能
Duration[long]
属性为动画持续时间
时间以毫秒为单位
fillAfter [boolean]
当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean]
当设置为true ,该动画转化在动画开始前被应用
interpolator
指定一个动画的插入器
有一些常见的插入器 accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果
repeatCount[int]
动画的重复次数
RepeatMode[int]
定义重复的行为
1:重新开始 2:plays backward
startOffset[long]
动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int]
定义动画的Z Order的改变
0:保持Z Order不变 1:保持在最上层 -1:保持在最下层
看了以上节点,大家是不是都想开始定义动画了。下面我们就开始结合具体的例子,介绍4种类型各自特有的节点元素。
表二
XML节点
功能说明
alpha
渐变透明度动画效果
fromAlpha
属性为动画起始时透明度
0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之间的float数据类型的数字
toAlpha
属性为动画结束时透明度
表三
scale
渐变尺寸伸缩动画效果
fromXScale[float] fromYScale[float]
为动画起始时,X、Y坐标上的伸缩尺寸
0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大
toXScale [float] toYScale[float]
为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float] pivotY[float]
为动画相对于物件的X、Y坐标的开始位置
属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
表四
translate
画面转换位置移动动画效果
fromXDelta toXDelta
为动画、结束起始时 X坐标上的位置
fromYDelta toYDelta
为动画、结束起始时 Y坐标上的位置
表五
rotate
画面转移旋转动画效果
fromDegrees
为动画起始时物件的角度
说明 当角度为负数——表示逆时针旋转 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转)
toDegrees
属性为动画结束时物件旋转的角度 可以大于360度
pivotX pivotY
为动画相对于物件的X、Y坐标的开始位
说明:以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置
看了上面的例子,想必大家也想看下,这些定义的动画,运行起来是什么样效果,下面运行Scale例子中的动画,界面变化如下:
按照上面的讲述学习完了Tween Animation的定义,对Tween Animation有了详细的了解,再去了解下Android SDK的animation package(android.view.animation),其提供了操作Tween Animation所有的类。
Android SDK提供了基类:Animation,包含大量的set/getXXXX()函数来设置、读取Animation的属性,也就是前面表一中显示的各种属性。Tween Animation由4种类型:alpha、scale、translate、roate,在Android SDK中提供了相应的类,Animation类派生出了AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation分别实现了平移、旋转、改变 Alpha 值等动画,每个子类都在父类的基础上增加了各自独有的属性。再去看下这几个类的构造函数,是不是与我们在表二、表三、表四、表五种定义的属性完全一样。
在了解了Tween Animation的定义,对android.view.animation有了一些基本的认识后,开始介绍Tween Animation如何使用。Android SDK提供了2种方法:直接从XML资源中读取Animation,使用Animation子类的构造函数来初始化Animation对象,第二种方法在看了Android SDK中各个类的说明就知道如何使用了,下面简要说明从XML资源中读取Animation,按照应用程序开发的过程,介绍整个使用的过程,如下:
创建Android工程;
导入一张图片资源;
将res\layout\main.xml中的TextView取代为ImageView;
在res下创建新的文件夹anim,并在此文件夹下面定义Animation XML文件;
修改OnCreate()中的代码,显示动画资源;
关键代码,解析如下: //main.xml中的ImageView ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); //加载动画 Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); //使用ImageView显示动画 spaceshipImage.startAnimation(hyperspaceJumpAnimation); 工程的源代码提供给大家下载,下载地址,这里简要解析如下:
AnimationUtils提供了加载动画的函数,除了函数loadAnimation(),其他的到Android SDK中去详细了解吧;
所谓的动画,也就是对 view 的内容做一次图形变换;
Java代码 package net.blogjava.mobile.interpolators; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.TranslateAnimation; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; public class Main extends Activity implements AdapterView.OnItemSelectedListener { private static final String[] INTERPOLATORS = { "Accelerate", "Decelerate", "Accelerate/Decelerate", "Anticipate", "Overshoot", "Anticipate/Overshoot", "Bounce" }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner s = (Spinner) findViewById(R.id.spinner); ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, INTERPOLATORS); adapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); s.setAdapter(adapter); s.setOnItemSelectedListener(this); } public void onItemSelected(AdapterView parent, View v, int position, long id) { final View target = findViewById(R.id.target); final View targetParent = (View) target.getParent(); Animation animation = new TranslateAnimation(0.0f, targetParent .getWidth() - target.getWidth() - targetParent.getPaddingLeft() - targetParent.getPaddingRight(), 0.0f, 0.0f); animation.setDuration(1000); animation.setStartOffset(300); animation.setRepeatMode(Animation.RESTART); animation.setRepeatCount(Animation.INFINITE); switch (position) { case 0: animation.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.accelerate_interpolator)); break; case 1: animation.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator)); break; case 2: animation.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.accelerate_decelerate_interpolator)); break; case 3: animation.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.anticipate_interpolator)); break; case 4: animation.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.overshoot_interpolator)); break; case 5: animation.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.anticipate_overshoot_interpolator)); break; case 6: animation.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.bounce_interpolator)); break; } target.startAnimation(animation); } public void onNothingSelected(AdapterView parent) { } }