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

在应用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

时间: 2025-01-01 09:25:16

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

Android系统移植与调试之-------&amp;gt;如何修改开机动画的两种方式剖析

首先,我们先来分析一下源码: frameworks/base/cmds/bootanimation/BootAnimation.cpp 首先看一下定义的常量: BootAnimation::readyToRun() 进入一个if判断语句 BootAnimation::threadLoop() ==> BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.p

Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

   在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是通过AsyncTask来实现,另一种方式则是通过ThreadPool来实现,今天我们就通过一个例子来讲解和对比这两种实现方式.     本文原创,如需转载,请注明转载地址http://blog.csdn.net/carrey1989/article/details/12002033     项

Android中手机录屏并转换GIF的两种方式

之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视频文件 (2)使用Google浏览器(Google Chrome)提供的扩展程序Vysor将手机界面演示在电脑上(几乎没有延时羡慕) 下面我们具体介绍两种方法的使用步骤: 一.使用cmd命令录屏 (1)SDK下载 网上有各种SDK下载的方法,个人认为安装AndroidStudio后连接自己的手机,根

android中图形图像处理之drawable用法分析_Android

本文实例讲述了android中图形图像处理之drawable用法.分享给大家供大家参考.具体如下: 一.如何获取 res 中的资源 数据包package:android.content.res 主要类:Resources 其主要接口按照功能,划分为以下三部分: getXXXX() 例如: int getColor(int id) Drawable getDrawable(int id) String getString(int id)  直接获取res中存放的资源 InputStream ope

android中图形图像处理之drawable用法分析

本文实例讲述了android中图形图像处理之drawable用法.分享给大家供大家参考.具体如下: 一.如何获取 res 中的资源 数据包package:android.content.res 主要类:Resources 其主要接口按照功能,划分为以下三部分: getXXXX() 例如: int getColor(int id) Drawable getDrawable(int id) String getString(int id)  直接获取res中存放的资源 InputStream ope

我的Android进阶之旅------&amp;gt;Android之Gallery和GridView两种方式与ImageSwitcher实现带预览的和幻灯片方式的两种图片浏览器

一.简介 a.GridView(网络视图)的功能和用法 b.ImageSwitcher(图形切换器)的功能和用法 c.Gallery(画廊视图)的功能和用法 二.通过一个实例来学习Gallery.GridView和ImageSwitcher step1:新建一个项目MyGridViewAndGallery                                            三:我们先写用GridView和ImageSwitcher实现 step1:设计所需的UI界面 a.  

Android——全屏显示的两种方式

Android--全屏显示的两种方式 文章分类:移动开发 A.设置主题实现全屏 直接在AndroidManifest.xml文件中设定Activity主题为全屏模式 android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 复制代码 B.代码实现全屏 代码实现需要分两步做,如下: 1.隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); 复制代码 2.隐藏状态栏 getWin

详解Android提交数据到服务器的两种方式四种方法_Android

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. 代码比较简单,这里不去过多的阐述,直接看代码. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传

android绘制圆形图片的两种方式示例

android绘制圆形图片的两种方式 看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap当做一种颜色 设置给paint ,paint都已经有颜色了 你想让它方了,圆了,扁了 还不是看你心情 canvas调用那个方法咯 实现的大致思路如下: 1. 创建一个类 继承imageView 重写onDraw() 2. 获取到bitmap图片 3. 计算图片的