【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
相关文章
|
8天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
7天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
19 5
|
5天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
6天前
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
22 3
|
7天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
20 2
|
9天前
|
存储 IDE 开发工具
探索Android开发之旅:从新手到专家
【10月更文挑战第26天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何在Android平台上从零开始,最终成为一名熟练的开发者。通过简单易懂的语言和实际代码示例,本文将引导你了解Android开发的基础知识、关键概念以及如何实现一个基本的应用程序。无论你是编程新手还是希望扩展你的技术栈,这篇文章都将为你提供价值和启发。让我们开始吧!
|
9天前
|
安全 搜索推荐 Android开发
揭秘iOS与安卓系统的差异:一场技术与哲学的较量
在智能手机的世界里,iOS和Android无疑是两大巨头,它们不仅定义了操作系统的标准,也深刻影响了全球数亿用户的日常生活。本文旨在探讨这两个平台在设计理念、用户体验、生态系统及安全性等方面的本质区别,揭示它们背后的技术哲学和市场策略。通过对比分析,我们将发现,选择iOS或Android,不仅仅是选择一个操作系统,更是选择了一种生活方式和技术信仰。
|
3天前
|
移动开发 Java Android开发
探索Android与iOS开发的差异性与互联性
【10月更文挑战第32天】在移动开发的大潮中,Android和iOS两大平台各领风骚。本文将深入浅出地探讨这两个平台的开发差异,并通过实际代码示例,展示如何在各自平台上实现相似的功能。我们将从开发环境、编程语言、用户界面设计、性能优化等多个角度进行对比分析,旨在为开发者提供跨平台开发的实用指南。
20 0
|
10天前
|
搜索推荐 安全 Android开发
安卓与iOS的哲学对话:技术生态中的选择与命运
【10月更文挑战第24天】 在智能设备的世界里,安卓和iOS不仅是操作系统的简单对立,它们代表了不同的技术哲学和生态策略。本文将探讨这两种系统背后的设计理念、用户体验差异以及它们如何塑造我们的数字生活,从而引发对于“我们如何选择技术”这一命题的深入思考。
|
10天前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
22 0