当前位置:首页 >> 计算机软件及应用 >>

Android Animation学习笔记详细


Android Animation 学习笔记 关于动画的实现,Android 提供了 Animation,在 Android SDK 介绍了 2 种 Animation 模式: 1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画; 2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。

动画类型
下面先来看看 Android 提供的动画类型。Android 的 animation 由四种类型组成 在 XML 文件中:

? ? ? ?

alpha scale

渐变透明度动画效果 渐变尺寸伸缩动画效果

translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果

在 Java 源码中定义了相应的类,可以使用这些类的方法来获取和操作相应的属性:

? ? ? ?

AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果

Tween Animation
一个 tween 动画将对视图对象中的内容进行一系列简单的转换(位置,大小,旋转,透明性)。如果你有一个文本视图对象,你可以移 动它,旋转它,让它变大或让它变小,如果文字下面还有背景图像,背景图像也会随着文件进行转换。 使用 XML 来定义 Tween Animation 动画的 XML 文件在工程中 res/anim 目录,这个文件必须包含一个根元素,可以使<alpha><scale> <translate> <rotate>插值 元素或者是把上面的元素都放入<set>元素组中,默认情况下,所以的动画指令都是同时发生的,为了让他们按序列发生,需要设置一

个特殊的属性 startOffset。动画的指令定义了你想要发生什么样的转换,当他们发生了,应该执行多长时间,转换可以是连续的也可以 使同时的。例如,你让文本内容从左边移动到右边,然后旋转 180 度,或者在移动的过程中同时旋转,没个转换需要设置一些特殊的参 数(开始和结束的大小尺寸的大小变化,开始和结束的旋转角度等等,也可以设置些基本的参数(例如,开始时间与周期),如果让几 个转换同时发生,可以给它们设置相同的开始时间,如果按序列的话,计算开始时间加上其周期。 Tween Animation 共同的节点属性 属性[类型] Duration[long] fillAfter [boolean] fillBefore[boolean] interpolator 功能 属性为动画持续时间 备注 时间以毫秒为单位

当设置为 true ,该动画转化在动画结束后被应用 当设置为 true ,该动画转化在动画开始前被应用 指定一个动画的插入器 有一些常见的插入器 accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果

repeatCount[int] RepeatMode[int] startOffset[long] zAdjustment[int]

动画的重复次数 定义重复的行为 1:重新开始 2:plays backward

动画之间的时间间隔,从上次动画停多少时间开始执行下个动画 定义动画的 Z Order 的改变 0:保持 Z Order 不变 1:保持在最上层 -1:保持在最下层 表二

XML 节点 alpha <alpha android:fromAlpha=”0.1″ android:toAlpha=”1.0″ android:duration=”3000″ /> fromAlpha toAlpha 属性为动画起始时透明度 属性为动画结束时透明度

功能说明 渐变透明度动画效果

0.0 表示完全透明 1.0 表示完全不透明 以上值取 0.0-1.0 之间的 float 数据类型的数字 duration 为动画持续时间,ms 单位 表三

scale <scale

渐变尺寸伸缩动画效果

android:interpolator= “@android:anim/accelerate_decelerate_interpolator” android:fromXScale=”0.0″ android:toXScale=”1.4″ android:fromYScale=”0.0″ android:toYScale=”1.4″

android:pivotX=”50%” android:pivotY=”50%” android:fillAfter=”false” android:startOffset=“700” android:duration=”700″ android:repeatCount=”10″ /> fromXScale[float] fromYScale[float] toXScale [float] toYScale[float] pivotX[float] pivotY[float] 为动画起始时,X、Y 坐标上的 0.0 表示收缩到没有 伸缩尺寸 1.0 表示正常无伸缩

为动画结束时,X、Y 坐标上的 值小于 1.0 表示收缩 伸缩尺寸 值大于 1.0 表示放大

为动画相对于物件的 X、 Y 坐标 属性值说明:从 0%-100%中取值,50%为物 的开始位置 件的 X 或 Y 方向坐标上的中点位置

表四 translate <translate android:fromXDelta=”30″ android:toXDelta=”-80″ android:fromYDelta=”30″ android:toYDelta=”300″ android:duration=”2000″ /> fromXDelta toXDelta fromYDelta toYDelta 为动画、结束起始时 Y 坐标上的位置 为动画、结束起始时 X 坐标上的位置 画面转换位置移动动画效果

表五 rotate <rotate android:interpolator=”@android:anim/accelerate_decelerate_interpolator” android:fromDegrees=”0″ android:toDegrees=”+350″ android:pivotX=”50%” android:pivotY=”50%” android:duration=”3000″ /> fromDegrees toDegrees 为动画起始时物件的角度 说明 画面转移旋转动画效果

属性为动画结束时物件旋转 当角度为负数——表示逆时针旋转 的角度 可以大于 360 度 当角度为正数——表示顺时针旋转 (负数 from——to 正数:顺时针旋转) (负数 from——to 负数:逆时针旋转) (正数 from——to 正数:顺时针旋转) (正数 from——to 负数:逆时针旋转)

pivotX

为动画相对于物件的 X、 Y 坐说明:以上两个属性值 从 0%-100%中取值

pivotY

标的开始位

50%为物件的 X 或 Y 方向坐标上的中点位置

下面给出一个完整的 XML 定义(SDK 提供) <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" android:fillBefore="false" /> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" /> </set> </set> Tween Animation 如何使用 使用 AnimationUtils 类的静态方法 loadAnimation()来加载 XML 中的动画 XML 文件

//main.xml 中的 ImageView ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); //加载动画 Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); //使用 ImageView 显示动画 spaceshipImage.startAnimation(hyperspaceJumpAnimation);
如何在 Java 代码中定义动画

//在代码中定义 动画实例对象

private Animation myAnimation_Alpha;

private Animation myAnimation_Scale;

private Animation myAnimation_Translate;

private Animation myAnimation_Rotate;

//根据各自的构造方法来初始化一个实例对象

myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);

myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,

Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);

myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,

Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f); interpolator 的解释 interpolator 定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速, 减速,重复等。 Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。 Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation 。Android 提供了几个 Interpolator 子类,实现了不同的速 度曲线,如下: AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速 AccelerateInterpolator CycleInterpolator DecelerateInterpolator LinearInterpolator 在动画开始的地方速率改变比较慢,然后开始加速 动画循环播放特定的次数,速率改变沿着正弦曲线 在动画开始的地方速率改变比较慢,然后开始减速 在动画的以均匀的速率改变

Frame Animation
Frame Animation 是顺序播放事先做好的图像,跟电影类似。不同于 animation package, Android SDK 提供了另外一个类 AnimationDrawable 来定义、使用 Frame Animation。 Frame Animation 可以在 XML Resource 定义(还是存放到 res\anim 文件夹下),也可以使用 AnimationDrawable 中的 API 定义。由于 Tween Animation 与 Frame Animation 有着很大的不同,因此 XML 定义的格式也完全不一样,其格式是:首先是 animation-list 根节点,animation-list 根节点中包含多个 item 子节点,每个 item 节点定义一帧动画,当前帧的 drawable 资源和当前帧持续的时间。下面对节点的元素加以说明:

XML 属性 drawable duration oneshot

说明 当前帧引用的 drawable 资源 当前帧显示的时间(毫秒为单位) 如果为 true,表示动画只播放一次停止在最后一帧上,如果设置为 false 表示 动画循环播放。

variablePadding

If true, allows the drawable’s padding to change based on the current state that is selected.

visible

规定 drawable 的初始可见性,默认为 flase;

下面就给个具体的 XML 例子,来定义一帧一帧的动画:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/rocket_thrust1" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust2" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust3" android:duration="200" /> </animation-list>
上面的 XML 就定义了一个 Frame Animation,其包含 3 帧动画,3 帧动画中分别应用了 drawable 中的 3 张图片:rocket_thrust1, rocket_thrust2,rocket_thrust3,每帧动画持续 200 毫秒。 然后我们将以上 XML 保存在 res/anim/文件夹下,命名为 rocket_thrust.xml,显示动画的代码:

AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image); rocketImage.setBackgroundResource(R.anim.rocket_thrust); rocketAnimation = (AnimationDrawable) rocketImage.getBackground(); }

public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { rocketAnimation.start(); return true; } return super.onTouchEvent(event); }
代码运行的结果:3 张图片按照顺序的播放一次. 有一点需要强调的是:启动 Frame Animation 动画的代码 rocketAnimation.start();不能在 OnCreate()中,因为在 OnCreate()中 AnimationDrawable 还没有完全的与 ImageView 绑定,在 OnCreate()中启动动画,就只能看到第一张图片。这里实在拖曳事件中 实现的。

下面,阅读 Android SDK 中对 AnimationDrawable 的介绍,有个简单的了解:

AnimationDrawable 获取、设置动画的属性 int getDuration() int getNumberOfFrames() boolean isOneShot() 获取动画的时长 获取动画的帧数 获取 oneshot 属性 设置 oneshot 属性 Void setOneShot(boolean oneshot) void inflate(Resurce r,XmlPullParser p, AttributeSet attrs) 增加、获取帧动画 Drawable getFrame(int index) void addFrame(Drawable frame,int duration) 动画控制 void start() void run() boolean isRunning() void stop() 开始动画 外界不能直接掉调用,使用 start()替代 当前动画是否在运行 停止当前动画 获取某帧的 Drawable 资源 为当前动画增加帧(资源,持续时长)


赞助商链接
相关文章:
Android画图学习总结(四)——Animation(上)
Android画图学习总结(四)——Animation(上)_IT/计算机...详细大家对 Tween Animation 的定义、使用都有了比较...Android学习笔记总结 112页 1下载券喜欢此文档的还喜...
Android学习笔记整理
Android 开发 学习笔记 小魏 CQU Android 开发 学习笔记 Android 是 Google 于...android.view.accessibility android.view.animation Provides classes that handle ...
Android动画学习
Android动画学习_计算机软件及应用_IT/计算机_专业资料。android 动画Android 动画学习笔记 3.0 以前,android 支持两种动画模式,tween animation,frame animation,在 and...
Android开发TranslateAnimation详解
Animation 透明度动画效果 2、ScaleAnimation 缩放动画效果 3、TranslateAnimation ...} 复制代码 更多 android 开发学习资料,请至麦子学院官网查看>http://www....
Mars老师的【Android视频教程】 笔记 Animations
Mars老师的【Android视频教程】 笔记 Animations_理学...在代码当中使用 AnimationUtils 当中装载 xml 文件,...Android学习笔记 50页 2下载券 Android应用开发入门教程...
android学习笔记
android学习笔记_IT/计算机_专业资料。android 开发入门学习笔记笔记: Xml 解析 ...Animation 介绍: <?xml version="1.0" encoding="utf-8"?> <set xmlns:...
android_Animation
Android Animation 学习笔记 关于动画的实现,Android 提供了 Animation,在 Android SDK 介绍了 2 种 Animation 模式: 1. Tween Animation:通过对场景里的对象不断做...
Android画图学习总结(四)——Animation(下 )
画图学习总结( Android 画图学习总结(四) ——Animation Animation( ——Animation(中) By: 海市蜃楼 | In: Android 开发 在 Android 画图学习总结(四)——Ani...
Android开发RotateAnimation详解
(View v) { /** 结束动画 */ animation.cancel(); } }); } } 更多 android 视频学习教程,请至麦子学院官网查看>>http://www.maiziedu.com/course/2/...
android学习笔记
android学习笔记_IT/计算机_专业资料。1. 获取元素 findViewById(元素 ID); 2...myAnimation=AnimationUtils.loadAnimation(this, R.anim.my_anim); spinner.set...
更多相关文章: