Tweened Animations有
4种样式,分别为Alpha,Rotate,Translate,Scale。分别表示渐变,旋转,位移,缩放。要实现以上4种动画,必须要给出每种动画的需要参数。
Alpha:因为是渐变,所以需要给出改变之前的透明度,改变之后的透明度,总共改变的时间。
Rotate:旋转,必定要知道旋转的圆心在哪边,所以要定义圆心的
X与Y轴,以及转动的时间,转动的角度等。
Translate:位移,即要知道原来对象的
XY轴和改变后的XY轴,以及运动的时间等。
Scale:缩放,首先要知道
XY轴缩放的比率,以及缩放前后中心坐标的变化,当然还有缩放的时间。
使用
Animation还需要知道一些知识点:
Interpolator:它定义了动画的速率,它有若干子类,
AccelerateDecelerateInterpolator是两头慢,中间快的动画效果, AccelerateInterpolator是加速的动画效果,DecelerateInterpolator是减速动画效果, LinearInterpolator是匀速动画效果,等等。这些加速效果可以根据实际的需求来使用。
AnimationSet:它是
Animation的一个集合,可以将定义好的各个动画,放入AnimationSet集合中,然后再进行对集合的设置,控制集合内的动画如何运行。
Tweened Animations实现有两种方式,一种为在
Java代码中设置,另一种为在XML文件中设置。两种方式各有优劣,下面一一介绍。
我们的例子是
Activity上有4个按钮和一张图片,4个按钮分别代表上面的四种动画效果。
布局文件很简单,就是
4个按钮和一张图片的定义设置,在此略去,附件中可见详情。
在
Java代码中,我们为每个按钮绑定了监听器。
Alpha监听器:
- class AlphaOnClickListener implements OnClickListener{
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- AnimationSet animationSet = new AnimationSet(true);//创建一个Animation的集合,这里构造函数的参数是个boolean值,他表示的是这个AnimationSet中是否共享一个Interpolator,也就是在这个集合内不同的动画是否以同样地速率变化,如果为false,那么下面需要对每一个动画进行Interpolator的设置。
- AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);//设置从不透明到透明,这里两个参数的取值为0~1,0表示完全透明,1表示完全不透明
- alphaAnimation.setDuration(2000);//设置动画的时间为2秒
- animationSet.addAnimation(alphaAnimation);//将创建的alphaAnimation加入Animation集合中
- item.startAnimation(animationSet);//在ImageView上设置动画
- }
- }
Rotate监听器:
- class RotateOnClickListener implements OnClickListener{
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- AnimationSet animationSet = new AnimationSet(true);//同上
- RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- //RotateAnimation有6个参数
- //1.初始的角度
- //2.旋转的角度,可以为负的,即为逆时针转
- //3.转的圆心的X坐标是相对谁为参照物的,这里有3种情况:RELATIVE_TO_SELF,RELATIVE_TO_PARENT,ABSOLUTE,分别是相对自己,相对父控件,绝对位置
- //4.具体的X坐标,与第三个参数有关,若第3个参数是Animation.RELATIVE_TO_SELF,第四个参数是0.5f,那么圆心的X坐标就是自身控件宽度的0.5倍
- //5.转的圆心的Y坐标是相对谁为参照物,参数同3
- //6. 具体的Y坐标,与第三个参数有关,若第3个参数是Animation.RELATIVE_TO_SELF,第四个参数是0.5f,那么圆心的Y坐标就是自身控件宽度的0.5倍
- rotateAnimation.setDuration(2000);//设置动画的时间
- animationSet.addAnimation(rotateAnimation);//将创建的alphaAnimation加入Animation集合中
- item.startAnimation(animationSet);//在ImageView上设置动画
- }
- }
Translate监听器:
- class TranslateOnClickListener implements OnClickListener{
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- AnimationSet animationSet = new AnimationSet(true);//创建一个Animation的集合
- TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1f);
- //第1,2个参数是变化之前的X坐标
- //第3,4个参数是变化之后的X坐标
- //第5,6个参数是变化之前的Y坐标
- //第7,8个参数是变化之后的Y坐标
- translateAnimation.setDuration(2000);//设置动画的时间
- animationSet.addAnimation(translateAnimation);//将创建的alphaAnimation加入Animation集合中
- item.startAnimation(animationSet);//在ImageView上设置动画
- }
- }
Scale监听器:
- class ScaleOnClickListener implements OnClickListener{
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- AnimationSet animationSet = new AnimationSet(true);//同上
- ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f,1,0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- //第1个参数是X的原始比率,第2个参数是X变化后的比率
- //第3个参数是Y的原始比率,第4个参数是Y变化后的比率
- //第5,6个参数是最后动画结束时的X轴坐标
- //第7,8个参数是最后动画结束时的Y轴坐标
- scaleAnimation.setDuration(2000);//设置动画的时间
- animationSet.addAnimation(scaleAnimation);//将创建的alphaAnimation加入Animation集合中
- item.startAnimation(animationSet);//在ImageView上设置动画
- }
- }
使用
XML文件来对动画进行定义和设置,首先要在res目录下建立anim文件夹,在这个文件夹下面就放置一个我们定义的XML文件,而且,每个XML文件都是以如下为标签:
- <?xml version="1.0" encoding="UTF-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- >
- </set>
我们将要定义的动画放在
set标签中,里面的android:interpolator属性就是定义了这个set中的动画是以什么速率进行变化的,它的值是android自带的,可以再Android API中查到。
看一下上述
4中动画的定义:
- <alpha
- android:fromAlpha="1.0"//初始透明度
- android:toAlpha="0.0"//结束透明度
- android:duration="3000"//时长
- ></alpha>
- <rotate
- android:fromDegrees="0"//初始旋转角度
- android:toDegrees="-360"//结束旋转角度,可为负,即逆时针
- android:duration="3000"//时长
- android:pivotX="50%" //下方介绍
- android:pivotY="50%"//下方介绍
- ></rotate>
- <scale
- android:fromXScale="1.0"//初始X坐标比率
- android:toXScale="0.1"//结束X坐标比率
- android:fromYScale="1.0"//初始Y坐标比率
- android:toYScale="0.1"//结束Y坐标比率
- android:pivotX="50%"//下方介绍
- android:pivotY="50%"//下方介绍
- android:duration="3000"//时长
- ></scale>
- <translate
- android:fromXDelta="0%"//下方介绍
- android:toXDelta="50%"//下方介绍
- android:fromYDelta="0%"//下方介绍
- android:toYDelta="100%"//下方介绍
- android:duration="3000"//时长
- ></translate>
我们在上面代码标注“下方介绍”的这些值,我们有三种写法,如:
50,50%,50%p。这三种写法就分别代表了ABSOLUTE,RELATIVE_TO_SELF和RELATIVE_TO_PARENT。
定义完
XML文件后,我们就要在Java代码中对其使用了。
举例,若将上面的
Alpha的XML文件命名为alpha.xml,则如此使用:
- class AlphaOnClickListener implements OnClickListener{
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Animation alphaAnimation = AnimationUtils.loadAnimation(AnimationDemo2Activity.this, R.anim.alpha);//载入alpha.xml
- item.startAnimation(alphaAnimation);//在ImageView上设置动画
- }
- }
也可以将多个效果放在一个文件中的一个
set内,那么这几个动画会根据自己的设置一起运行,达到对同一个对象的多种效果的叠加效果。