Android平台支持4种类型的图画动画:
GIF图像:动画GIF是独立的动画文件,包含多帧;
逐帧动画(Frame-by-frameanimation):Android SDK提供了一种逐帧动画机制,开发人员只需提供各个图形帧,就能在他们之间切换;
渐变动画(Tweened animation):渐变动画提供了一种简单而灵活的方法,让您能够定义可用于任何试图或不惧的动画操作,这是最常用的一种;
OpenGL ES:Android OpenGL ES API提供了高级三维绘画、动画、光照和纹理功能。
由于渐变动画应用比较广泛,在这里我们只讲通过以编程方式创建简便序列,实现渐变动画:
每一个渐变动画都必须有独立的XML文件存储于/res/anim中,但是都一个动画可用于应用程序中的任何视图控件。您还可以利用内置的动画资源,他们是有android.R.anim类提供的。
下面的代码实现的是让目标在2500毫秒(2.5秒)内透明度从0(透明)逐渐增加到1(不透明):
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2500"/>
</set>
下面的代码与上面的完全相同,知识将属性startOffset设置为2500(毫秒),这意味着这个动画总共需要5秒钟:等待2.5秒后再播放2.5秒:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2500"
android:startOffset="2500"/>
</set>
上面的两个XML可以应用于除布局控件外的任何控件中,但是如果我们要用于一个布局空间中所有的子控件,应该如何写呢?下面的代码实现了目标的旋转、缩放和透明度的变化:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000"/>
<scale
android:pivotX="50%"
android:pivotY="50%"
android:fromXScale="0.1"
android:toXScale="1.0"
android:fromYScale="0.1"
android:toYScale="1.0"
android:duration="2000"/>
</set>
下面是对以上代码中每一个属性的解释:
fromXScale 起始时x坐标的尺寸,设置为1.0说明是整个图片x轴的长度
toXScale 结束时x坐标的尺寸,设置为0.0说明整个图片x轴完全收缩到无
fromYScale 起始时y坐标的尺寸,设置为1.0说明是整个图片y轴的长度
toYScale 结束时y坐标的尺寸,设置为1.0说明是在收缩时y轴的长度保持不变
那么他们的变化都是先对于某一点来变化的,因此pivotX和pivotY就是确定这个点的位置。
在一个数轴上(原点为图片的左上角,x轴和y轴的射线分别是向右和向下,我测试过):
pivotX="50%" 说明是以图片本身的一半作为x轴的坐标;
pivotY="50%" 说明是以图片本身的一半作为y轴的坐标;
所以圆心点的坐标就是(0.5x,0.5y)。(x y是原图片的长和高)
duration 是设置的动画执行时间
startOffset是设置的动画执行前停顿的时间
其中alpha还有一个属性叫做Interpolator,它用来指定动画的变化速度,一共有以下一种模式:
——AccelerateInterpolator:动画从开始到结束,变化率是一个加速的过程。
——DecelerateInterpolator:动画从开始到结束,变化率是一个减速的过程。
——CycleInterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。
——AccelerateDecelerateInterpolator:动画从开始到结束,变化率是先加速后减速的过程。
——LinearInterpolator:动画从开始到结束,变化率是线性变化。
看完解释之后,我们再看一个例子以便深化理解,这是一个伸展的效果的配置文件:
<?xml version="1.0"encoding="utf-8"?>
<set android:interpolator="@android:anim/accelerate_interpolator">
<scale
android:fromXScale="0.0"
android:toXScale="1.0"
android:fromYScale="1.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="150"/>
</set>
下面的工作就是把我们制作的动画效果绑定在控件中了,有两种方法:
1、将动画效果用于特定视图:
textView1 =(TextView)findViewById(R.id.textView1);
textView2 =(TextView)findViewById(R.id.textView2);
//将动画效果绑定在控件上
Animation animation =AnimationUtils.loadAnimation(this, R.anim.fade_in);
textView1.setAnimation(animation);
textView2.setAnimation(AnimationUtils.loadAnimation(this,R.anim.fade_in_long));
2、将动画效果用于布局中的所有视图
//将动画效果用于布局中的所有视图
tableLayout =(TableLayout)findViewById(R.id.tableLayout);
LayoutAnimationControllerlayoutAnimationController =newLayoutAnimationController(AnimationUtils.loadAnimation(this,R.anim.custom_anim));
for (int i = 0; i< tableLayout.getChildCount(); i++)
{
TableRow tableRow =(TableRow)tableLayout.getChildAt(i);
tableRow.setLayoutAnimation(layoutAnimationController);
}