【Android开发】图形图像处理技术-实现Android动画的两种方式

时间:2023-02-06 22:39:17
在应用Android进行项目开发时,特别是在进行游戏开发时,经常需要涉及动画。Android中的动画通常可以分为逐帧动画(Frame Animation)和补间动画(Tween Animation)两种。下面将分别介绍这两种动画。

一.实现逐帧动画(Frame Animation)
逐帧动画就是顺序播放事先准备好的静态图像,利用人眼的"视觉暂留"原理,给用户造成动画的错觉。实现逐帧动画比较简单,只需要一下两个步骤:
(1)在Android XML资源文件中定义一组用于生成动画的图片资源,可以使用包含一系列<item></item>子标记的<animation-list></animation-list>标记来实现,具体语法格式如下:
<animation xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true|false">
<item android:drawable="@drawable/图片资源名1" android:duration="integer"/>
......<!--此处省略了部分<item></item>标记-->......
<item android:drawable="@drawable/图片资源名n" android:duration="integer"/>
</animation>

在上面的语法中,android:oneshot属性用于设置是否循环播放,默认值为true,表示循环播放;android:drawable属性用于指定要显示的图片资源;android:duration属性指定图片资源持续的时间。

(2)使用(1)中定义的动画资源。可以作为某布局管理器的背景使用,也可以作为ImageView的背景使用。

在Android中逐帧动画需要得到AnimationDrawable类的支持,它位于"android.graphics.drawable.AnimationDrawable"包下,是Drawable的间接子类。它主要用来创建一个逐帧动画,并且可以对帧进行拉伸,把它设置为View的背景即可使用AnimationDrawable.start()方法播放。既然逐帧动画是需要播放一帧一帧的图像,所以需要为其添加帧。在Android中提供了两种方式为AnimationDrawable添加帧:XML定义的资源文件和Java代码创建,后面再详细讲讲这两种添加帧的方式。

简单介绍一下AnimationDrawable的常用方法:
 
void start():开始播放逐帧动画。
void stop():停止播放逐帧动画。
void addFrame(Drawable frame,int duration):为AnimationDrawable添加一帧,并设置持续时间。
int getDuration(int i):得到指定index的帧的持续时间。
Drawable getFrame(int index):得到指定index的帧Drawable。
int getNumberOfFrames():得到当前AnimationDrawable的所有帧数量。
boolean isOneShot():当前AnimationDrawable是否执行一次,返回true执行一次,false循环播放。
boolean isRunning():当前AnimationDrawable是否正在播放。
void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放

二.实现补间动画(Tween Animation)
补间动画就是通过对场景里的对象不断进行图像变化来产生动画效果。在实现补间动画时,只需定义动画开始和动画结束的关键帧,其他过渡帧由系统自动计算补齐。在Android中,提供了4种补间动画。

(1)透明度渐变动画(AlphaAnimation)
通过设定对象开始时与结束时的透明度以及持续时间来给对象创建一个透明度渐变的动画。基本的语法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource">
<alpha
android:repeatMode="reverse|restart"
android:repeatCount="次数|infinite"
android:duration="Integer"
android:fromAlpha="float"
android:toAlpha="float"/>
</set>

在上面的语法中,各属性说明如表1.1所示:

表1.1
interpolator    属性为控制动画的变化速度(加速、匀速、减速或抛物线速度等,如表1.2)
fromAlpha 属性为动画起始时透明度
toAlpha 属性为动画结束时透明度
(0.0表示完全透明,1.0表示完全不透明,以上值取0.0-1.0之间的float数据类型的数字)
duration 属性为持续时间,单位为毫秒
repeatCount 属性为设置动画重复次数,可以是数值,也可以是infinite(无限循环)
repeatMode 属性为设置动画的重复方式,可选值为reverse(反向)和restart(重新开始)

表1.2
@android:anim/accelerate_decelerate_interpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速

@android:anim/accelerate_interpolator  在动画开始的地方速率改变比较慢,然后开始加速

@android:anim/anticipate_interpolator 开始的时候先后退一小步再开始动画

@android:anim/anticipate_overshoot_interpolator 开始的时候先后退一小步再开始动画,到结束的地方再超出一小步,回到动画结束的地方

@android:anim/bounce_interpolator   动画结束的时候弹起

@android:anim/cycle_interpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

@android:anim/decelerate_interpolator 在动画开始的地方快然后慢

@android:anim/linear_interpolator   以常量速率改变

@android:anim/overshoot_interpolator   快速达到终点并超出一小步,最后回到动画结束的地方


例如,定义一个让View组件从完全透明到完全不透明、持续时间为2秒的动画,可以使用下面的代码:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000">
</set>

(2)旋转动画(RotateAnimation)
通过设定对象开始时与结束时的旋转角度以及持续时间来给对象创建一个旋转对象的动画。还可以通过指定轴心点坐标来改变旋转的中心,基本的语法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource">
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float"
android:repeatMode="reverse|restart"
android:repeatCount="次数|infinite"
android:duration="Integer"/>
</set>

在上面的语法中,各属性说明如表2.1所示:

表2.1
interpolator    上一个动画已经介绍过(控制动画变化速度)
fromDegrees 属性为指定动画开始时的旋转角度
toDegrees 属性为指定动画结束时的旋转角度
pivotX 属性为指定轴心点的X坐标
pivotY 属性为指定轴心点的Y坐标
duration 属性为持续时间,单位为毫秒
repeatCount 属性为设置动画重复次数,可以是数值,也可以是infinite(无限循环)
repeatMode 属性为设置动画的重复方式,可选值为reverse(反向)和restart(重新开始)

例如,定义一个让图片从0度转到360度、持续时间为2秒、中心点在图片的中心的动画,可以使用下面的代码:
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000">
</rotate>

(3)缩放动画(ScaleAnimation)
通过设定对象开始时与结束时的缩放系数以及持续时间来给对象创建一个缩放对象的动画。还可以通过指定轴心点坐标来改变缩放的中心,基本的语法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource">
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float"
android:repeatMode="reverse|restart"
android:repeatCount="次数|infinite"
android:duration="Integer"/>
</set>

在上面的语法中,各属性说明如表2.1所示:

表2.1
interpolator    已经介绍过(控制动画变化速度)
fromXScale 属性为指定动画开始时水平方向上的缩放系数(值为1.0表示不变化)
toXScale 属性为指定动画结束时水平方向上的缩放系数(值为1.0表示不变化)
fromYScale 属性为指定动画开始时垂直方向上的缩放系数(值为1.0表示不变化)
toYScale 属性为指定动画结束时垂直方向上的缩放系数(值为1.0表示不变化)
pivotX 属性为指定轴心点的X坐标
pivotY 属性为指定轴心点的Y坐标
duration 属性为持续时间,单位为毫秒
repeatCount 属性为设置动画重复次数,可以是数值,也可以是infinite(无限循环)
repeatMode 属性为设置动画的重复方式,可选值为reverse(反向)和restart(重新开始)


例如,定义一个以图片的中心点为轴心点,将图片放大2倍的,持续时间为2秒的动画,可以使用下面的代码:
<scale
android:fromXScale="1"
android:toXScale="2.0"
android:fromYScale="1"
android:toYScale="2.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000">
</scale>

(4)平移动画(Translate Animation)
通过设定对象开始时与结束时的位置以及持续时间来给对象创建一个缩放对象的动画。基本的语法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource">
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float"
android:repeatMode="reverse|restart"
android:repeatCount="次数|infinite"
android:duration="Integer"/>
</set>

在上面的语法中,各属性说明如表2.1所示:

表2.1
interpolator    已经介绍过(控制动画变化速度)
fromXDelta 属性为指定动画开始时水平方向上的起始位置
toXDelta 属性为指定动画结束时水平方向上的起始位置
fromYDelta 属性为指定动画开始时垂直方向上的起始位置
toYDelta 属性为指定动画结束时垂直方向上的起始位置
duration 属性为持续时间,单位为毫秒
repeatCount 属性为设置动画重复次数,可以是数值,也可以是infinite(无限循环)
repeatMode 属性为设置动画的重复方式,可选值为reverse(反向)和restart(重新开始)

例如,定义一个让图片从(0,0)点到(300,300)点、持续时间为2秒钟的动画,可以使用下面的代码:

<scale
android:fromXDelta="0"
android:toXDelta="300"
android:fromYDelta="0"
android:toYDelta="300"
android:duration="2000">
</scale>

转载请注明出处:http://blog.csdn.net/acmman/article/details/45699939