Android 动画之Animation篇
Android的Animation是一种提供2D动画效果的类,在应用开发中会经常用到,以此来提高用户的体验性能。根据Android SDK 提供的内容,Animation共分两种:tweened animation(渐变动画)和 frame-by-frame animation(画面转换动画)。
一、 Tweened Animation
在渐变动画中可有四种分类,如下表:
名称 |
XML |
JAVA |
渐变透明度 |
<alpha></alpha> |
AlphaAnimation |
渐变尺寸 |
<scale></scale> |
ScaleAnimation |
画面位置转换 |
<translate></translate> |
TranslateAnimation |
画面旋转 |
<rotate></rotate> |
RotateAnimation |
注:AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation继承于Animation
Tween Animation共同的节点属性
属性[类型] |
功能 |
备注 |
Duration[long] |
属性为动画持续时间 |
时间以毫秒为单位 |
fillAfter [boolean] |
当设置为true ,该动画转化在动画结束后被应用 |
|
fillBefore[boolean] |
当设置为true ,该动画转化在动画开始前被应用 |
|
interpolator |
指定一个动画的插入器 |
有一些常见的插入器 |
repeatCount[int] |
动画的重复次数 |
|
RepeatMode[int] |
定义重复的行为 |
1:restart 重新开始 2:reverse 回退 |
startOffset[long] |
动画之间的时间间隔,从上次动画停多少时间开始执行下个动画 |
|
zAdjustment[int] |
定义动画的Z Order的改变 |
0:保持Z Order不变 |
1、 在XML文件中定义
在res下建立文件夹anim。所有的动画xml文件都要放在anim里。以下是关于4种类型动画在XML中节点说明:
XML节点 |
功能说明 |
|
alpha |
渐变透明度动画效果 |
|
<alpha |
||
fromAlpha |
属性为动画起始时透明度 |
0.0表示完全透明 duration为动画持续时间,ms单位 |
toAlpha |
属性为动画结束时透明度 |
scale |
渐变尺寸伸缩动画效果 |
|||
<scale |
||||
fromXScale[float] fromYScale[float] |
为动画起始时,X、Y坐标上的伸缩尺寸 |
0.0表示收缩到没有 |
||
toXScale [float] |
为动画结束时,X、Y坐标上的伸缩尺寸 |
|||
pivotX[float] |
为动画相对于物件的X、Y坐标的开始位置 |
属性值说明:50%为物件的X或Y方向坐标上的中点位置,相对于自身。”50“代表绝对位置,“50%p”这代表相对于父控件来说。 |
translate |
画面转换位置移动动画效果 |
|
<translate |
||
fromXDelta |
为动画、结束起始时 X坐标上的位置 |
以自身中心为坐标原点,数值为正则 向正方向,反之为负方向。 |
fromYDelta |
为动画、结束起始时 Y坐标上的位置 |
以自身中心为坐标原点,数值为正则 向正方向,反之为负方向。当不设时或者数值为0%时为自身位置。 |
rotate |
画面转移旋转动画效果 |
|
<rotate |
||
fromDegrees |
为动画起始时物件的角度 |
说明 |
toDegrees |
属性为动画结束时物件旋转的角度 可以大于360度 |
|
pivotX |
为动画相对于物件的X、Y坐标的开始位 |
属性值说明:50%为物件的X或Y方向坐标上的中点位置,相对于自身。”50“代表绝对位置,“50%p”这代表相对于父控件来说。 |
这4类动画的定义都必须放在<set></set>节点里,并且可以一起使用,如下:
1 <set xmlns:android="http://schemas.android.com/apk/res/android" 2 3 android:interpolator="@android:anim/linear_interpolator" 4 5 android:shareInterpolator="true"> 6 7 <!-- 淡入淡出 --> 8 9 <alpha 10 11 android:fromAlpha="1.0" 12 13 android:toAlpha="0.5" 14 15 android:duration="1500" 16 17 android:repeatCount="infinite" 18 19 android:repeatMode="reverse" /> 20 21 22 23 <!-- 公传360度 --> 24 25 <rotate 26 27 android:fromDegrees="0" 28 29 android:toDegrees="+360" 30 31 android:pivotX="50%" 32 33 android:pivotY="50%" 34 35 android:duration="3000" 36 37 android:repeatCount="infinite" 38 39 android:repeatMode="restart" /> 40 41 </set>
动画xml文件定义完后,在Activity中调用,方法如下:
Animation anim=AnimationUtils.loadAnimation(MyActivity.this, R.anim.alpha_anim); img.setAnimation(anim);
AnimationUtils为android加载并解析动画定义的一个类。MyActivity.this为当前Activity类的上下文。R.anim.alpha_anim为引用anim文件夹里定义的名叫alpha_anim.xml的动画定义文件。imageView为想要为之添加动画的图片。
2、 在JAVA代码中定义
下面一段代码为在java中定义四类动画:
1 //在代码中定义 动画实例对象 2 3 private Animation myAnimation_Alpha; 4 5 private Animation myAnimation_Scale; 6 7 private Animation myAnimation_Translate; 8 9 private Animation myAnimation_Rotate; 10 11 //根据各自的构造方法来初始化一个实例对象 12 13 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); 14 15 myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, 16 17 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 18 19 myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); 20 21 myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f, 22 23 Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
AlphaAnimation
① AlphaAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② AlphaAnimation类对象构造
AlphaAnimation(float fromAlpha, float toAlpha)
//第一个参数fromAlpha为 动画开始时候透明度
//第二个参数toAlpha为 动画结束时候透明度
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
//说明:
// 0.0表示完全透明
// 1.0表示完全不透明
③ 设置动画持续时间
myAnimation_Alpha.setDuration(5000);
//设置时间持续时间为 5000毫秒
ScaleAnimation
① ScaleAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② ScaleAnimation类对象构造
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坐标上的伸缩尺寸
/*说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
*/
//第五个参数pivotXType为动画在X轴相对于物件位置类型
//第六个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第七个参数pivotXType为动画在Y轴相对于物件位置类型
//第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置
myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
③ 设置动画持续时间
myAnimation_Scale.setDuration(700);
TranslateAnimation
① TranslateAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② TranslateAnimation类对象构造
TranslateAnimation(float fromXDelta, float toXDelta,
float fromYDelta, float toYDelta)
//第一个参数fromXDelta为动画起始时 X坐标上的移动位置
//第二个参数toXDelta为动画结束时 X坐标上的移动位置
//第三个参数fromYDelta为动画起始时Y坐标上的移动位置
//第四个参数toYDelta为动画结束时Y坐标上的移动位置
③ 设置动画持续时间
myAnimation_Translate.setDuration(2000);
//设置时间持续时间为 2000毫秒
④设置动画变化应用时机
//动画结束后状态应用
myAnimation_Translate.setFillAfter(true);
//动画开始前状态应用
myAnimation_Translate.setFillBefore(false);
RotateAnimation
① RotateAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② RotateAnimation类对象构造
RotateAnimation(float fromDegrees, float toDegrees,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一个参数fromDegrees为动画起始时的旋转角度
//第二个参数toDegrees为动画旋转到的角度
//第三个参数pivotXType为动画在X轴相对于物件位置类型
//第四个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第五个参数pivotXType为动画在Y轴相对于物件位置类型
//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置
myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
③ 设置动画持续时间
myAnimation_Rotate.setDuration(3000);
//设置时间持续时间为 3000毫秒
在放缩,旋转,移动的过程中,有三种参数,Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, Animation.RELATIVE_TO_PARENT分别代表的是绝对位置,相对于自身的位置,相对于父控件的位置。
二、 Frame-by-frame Animation
Frame Animation 是顺序播放预先做好的图片,通过人的视觉误差来实现动画效果,跟电影原理类似。一般的用法是,我们用这些有播放规律的一系列图片来制作成一个frame-by-frame animation的xml文件,然后把它作为某个View 的背景图片,再执行播放效果。
Frame Animation可以在XML Resource定义(还是存放到res\anim文件夹下),也可以使用AnimationDrawable中的API定义。由于Tween Animation与Frame Animation有着很大的不同,因此XML定义的格式也完全不一样,其格式是:首先是animation-list根节点,animation-list根节点中包含多个item子节点,每个item节点定义一帧动画,当前帧的drawable资源和当前帧持续的时间。下面对节点的元素加以说明:
XML属性 |
说明 |
drawable |
当前帧引用的drawable资源 |
duration |
当前帧显示的时间(毫秒为单位) |
oneshot |
如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。 |
variablePadding |
如果为true,可以根据当前选中的状态来改变drawable的padding |
visible |
规定drawable的初始可见性,默认为flase; |
下面是官方文档提供的xml代码:
<!-- Animation frames are wheel0.png -- wheel5.png files inside the res/drawable/ folder --> <animation-list android:id="selected" android:oneshot="false"> <item android:drawable="@drawable/wheel0" android:duration="50" /> <item android:drawable="@drawable/wheel1" android:duration="50" /> <item android:drawable="@drawable/wheel2" android:duration="50" /> <item android:drawable="@drawable/wheel3" android:duration="50" /> <item android:drawable="@drawable/wheel4" android:duration="50" /> <item android:drawable="@drawable/wheel5" android:duration="50" /> </animation-list>
其中whell0~whell5是要播放的一系列图片,下面是在Activity里调用:
1 2 3 package cn.yj3g.AnimationsAPI; 4 5 6 7 import android.app.Activity; 8 9 import android.graphics.drawable.AnimationDrawable; 10 11 import android.os.Bundle; 12 13 import android.view.View; 14 15 import android.view.View.OnClickListener; 16 17 import android.widget.Button; 18 19 import android.widget.ImageView; 20 21 22 23 public class AnimationsAPIActivity3 extends Activity implements OnClickListener { 24 25 private ImageView imageView; 26 27 private Button moveButton; 28 29 30 31 @Override 32 33 public void onCreate(Bundle savedInstanceState) { 34 35 super.onCreate(savedInstanceState); 36 37 setContentView(R.layout.framebyframe); 38 39 // 找到布局文件中的控件 40 41 imageView = (ImageView) findViewById(R.id.iv_imagemove); 42 43 moveButton = (Button) findViewById(R.id.move); 44 45 moveButton.setOnClickListener(this); 46 47 } 48 49 50 51 @Override 52 53 public void onClick(View v) { 54 55 //得到配置文件中的背景文件 56 57 imageView.setBackgroundResource(R.drawable.anim_nv); 58 59 AnimationDrawable animationDrawable = (AnimationDrawable) imageView 60 61 .getBackground(); 62 63 animationDrawable.start(); 64 65 } 66 67 }
这里注意一点是,不能在Acitity的onCreate方法里启动动画,否则你只能看到第一张图片,而没有动画效果。因为onCreate中AnimationDrawable还没有与window关联。