`
- 浏览:
125088 次
- 性别:
- 来自:
深圳
-
Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame 动画,即顺序播放事先做好的图像,跟电影类似。本文分析了 Tween 动画的实现原理。
主要思路
Tween 动画通过对 View 的内容完成一系列的图形变换 (包括平移、缩放、旋转、改变透明度)来实现动画效果。
具体来讲,预先定义一组指令,这些指令指定了图形变换的类型、触发时间、持续时间。这些指令可以是以 XML 文件方式定义,也可以是以源代码方式定义。程序沿着时间线执行这些指令就可以实现动画效果。
动画的进度使用 Interpolator 控制,android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如LinearInterpolator 实现了匀速效果、 Accelerateinterpolator 实现了加速效果、DecelerateInterpolator 实现了减速效果等。还可以定义自己的 Interpolator 子类,实现抛物线、自由落体等物理效果。
动画的运行模式有两种:
独占模式,即程序主线程进入一个循环,根据动画指令不断刷新屏幕,直到动画结束;
中断模式,即有单独一个线程对时间计数,每隔一定的时间向主线程发通知,主线程接到通知后更新屏幕;
图形变换通过仿射矩阵实现。图形变换是图形学中的基本知识。简单来说就是,每种变换都是一次矩阵运算。在 Android 中,Canvas 类中包含当前矩阵,当调用 Canvas.drawBitmap (bmp, x, y, Paint) 绘制时,android 会先把 bmp 做一次矩阵运算,然后将运算的结果显示在 Canvas 上。这样,编程人员只需不断修改 Canvas 的矩阵并刷新屏幕,View 里的对象就会不停的做图形变换,动画就形成了。
在 android 中提供了 Animation 、 Interpolator、Transformation 等类具体实现 Tween 动画,下面逐一分析。
Animation 类及其子类
Animation 类及其子类是动画的核心模块,它实现了各种动画效果,如平移、缩放、旋转、改变透明度等。
Tween 动画的每一桢都根据 Interpolator 对 view 的内容做一次图形变换,因此 Animation 的核心工作是做变换(transformation)。
Aniamtion 是基类,他记录了动画的通用属性和方法。主要的属性包括动画持续时间、重复次数、interpolator 等。动画里最重要的方法是 getTransformation (currentTime, outTransformation),该方法根据当前间 (currentTime) 和 interpolator,计算当前的变换,在 outTransformation 中返回。
TranslateAnimation、RotateAnimation、AlphaAnimation 等是 Animation 的子类,分别实现了平移、旋转、改变 Alpha 值等动画。
每个动画都重载了父类的 applyTransformation 方法,这个方法会被父类的 getTransformation 方法调用。另外每个动画还有个 initialize 方法,完成初始化工作。
不同的动画具有不同的属性,如 RotateAnimation 的属性是起始角度、终止角度和旋转点坐标, TranslateAnimation 的属性是起始位置和终止位置。AlphaAnimation 的属性是起始 alpha 值和终止 alpha 值。
Animation 类及其子类的类图如下所示:
android类及其子类
Interpolator 类及其子类
Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等;
Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation.
LinearInerpolator、AccelerateInterpolator, DecelerateInterpolator, AccelerateDecelerateInterpolator,CycleInterpolator 是 Interpolator 的子类,分别实现了匀速、加速、减速、变速、循环等效果。
对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.
public float getInterpolation(float input) {
return input;
}
对于 AccelerateInterpolator,开始变化很慢,然后逐渐变快,即 f(x) = x*x 或者 f(x) = pow(x, 2*mFactor).
public float getInterpolation(float input) {
if (mFactor == 1.0f) {
return (float)(input * input);
} else {
return (float)Math.pow(input, 2 * mFactor);
}
}
对于 AccelerateDecelerateInterpolator,变化率开始和结束都很慢,但中间很快,即 f(x) = (cos ((x+1)*PI) / 2.0f) + 0.5f.
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}
Interpolator 类及其子类的类图如下所示:
Interpolator 类及其子类
Transformation 类
Transformation 记录了仿射矩阵 Matrix,动画每触发一次,会对原来的矩阵做一次运算, View 的 Bitmap 与这个矩阵相乘就可实现相应的操作(旋转、平移、缩放等)。
Transformation 类封装了矩阵和 alpha 值,它有两个重要的成员,一是 mMatrix,二是 mAlpha。
Transformation 类图如下所示:
Transformation 类图
如何在 View 中实现动画
从逻辑上讲,实现动画需要如下几步:
view 创建动画对象,设置动画属性,调用 invalidate 刷新屏幕,启动动画;
invalidate 方法触发了 onDraw 函数;
在 onDraw 函数中:
调用动画的 getTransformation 方法,得到当前时间点的矩阵
将该矩阵设置成 Canvas 的当前矩阵
调用 canvas 的 drawBitmap 方法,绘制屏幕。
判断 getTransformation 的返回值,若为真,调用 invalidate 方法,刷新屏幕进入下一桢;若为假,说明动画完成。
整个流程可用一个序列图表示:
Tween 动画序列图
使用样例
下面的代码是一个 view,系统创建 view 时会调用 onCreate 方法,该方法定义了一个 TranslateAniamtion,指定了移动起点和终点,动画持续时间为 1s,最后调用 startAnimation 将该动画保存在 View 的成员 mCurrentAnianmtion 中并启动动画。
注意,在 View 中需要定义成员变量 mCurrentAnimation 和 mTransformation ,分别记录当前的动画和变换。另外需要定义成员函数 startAnimation 启动动画。
class MyView extends View {
Animation mCurrentAnimation = null;
Transformation mTransformation = new Transformation;
private void setAnimation(Animation animation) {
mCurrentAnimation = animation;
if (animation != null) {
animation.reset();
}
}
public void startAnimation(Animation animation) {
animation.setStartTime(animation.START_ON_FIRST_FRAME);
setAnimation(animation);
invalidate();
}
onDraw (Canvas canvas) {
long curTime = SystemClock.uptimeMillis ();
if (mCurrentAniamtion == null){
canvas.drawBitmap (b, x, y, mPaint);
}
else {
if (!mCurrentAnimation.isInitialized()) //initialize animation
mCurrentAnimation.initialize (w, h, pw, ph);
boolean more = mCurrentAnimation.getTransformation (curTime, mTransformation);
if(more) {
Matrix m = canvas.getMatrix();
canvas.setMatrix (mTransformation.getMatrix());
canvas.drawBitmap (b, x, y, mPaint);
canvas.setMatrix (m);
this.invalidate ();
}
else {
mCurrentAnimation = null;
this.invalidate ();
}
}
}
void onCreate (){
Animation anim = new TranslateAnimation (10, 20, 0, 0);
anim.setDuration (1000); // 1s
anim.setInterpolator (new AcceleratInterpolator(3.0f));
startAniamtion (anim);
}
}
原文:http://www.linuxgraphics.cn/animation/android_tween_animation.html
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在Android开发中,动画效果是提升用户体验的关键因素之一。渐变动画是Android动画体系中的一种基本类型,它可以为用户界面带来生动和动态的感觉。本文将深入探讨四种主要的渐变动画:Alpha(透明度)、Scale(缩放)...
首先,让我们了解Android中的基本动画类型。Android支持两种主要的动画机制:补间动画(Tween Animation)和帧动画(Frame Animation)。补间动画用于改变视图的位置、大小、透明度等属性,它通过在一段时间内平滑地...
在Android开发中,动画效果是提升用户体验的重要手段。然而,有时候在实现动画过程中,我们可能会遇到这样一个问题:当一个View执行动画并移出其父布局时,它会被父布局自动裁剪,导致动画效果不完整。这个问题在...
在Android开发中,动画是提升用户体验的关键因素,它能让应用变得更加生动、有趣。这份"Android动画测试源码"提供了一种深入理解Android动画机制的方式,通过实际的代码示例进行学习和测试。以下是对相关知识点的...
本文将深入探讨在Android中如何创建和使用各种动画,特别是属性动画和补间动画,这些都是Android动画的基础和核心。 首先,我们来理解补间动画(Tween Animation)。补间动画是在两个关键帧之间平滑地改变对象的...
在Android开发中,动画效果是提升用户体验和应用视觉吸引力的关键元素。本文将深入探讨"Android动画效果大全",包括各种类型的动画以及如何基于这些技术实现炫酷的特效。 首先,Android提供两种主要的动画机制:帧...
在Android中,所有的动画都可以通过`Animation`类或者其子类来创建。`Animation`类提供了一些基本属性,如动画的持续时间、重复次数、是否反向播放等。开发者可以通过设置这些属性来定制动画效果。 接着,`BAnim_v7...
- 对于复杂动画,可以使用硬件加速来提高性能,设置`android:hardwareAccelerated="true"`在`<application>`标签中。 总结,Android动画原理涵盖了视图动画和属性动画,它们各自有其特点和适用场景。通过...
本文将深入探讨在Android中实现的各种动画类型,包括渐变动画、旋转动画、位移动画、缩放动画、混合动画、布局动画以及属性动画。这些知识点都是Android开发者,尤其是新手,必须掌握的基础技能。 首先,我们来看...
在Android中,Tween动画主要通过`Animation`类及其子类来实现。例如,`RotateAnimation`用于旋转动画,`TranslateAnimation`用于平移动画,`ScaleAnimation`用于缩放动画。Tween动画的核心在于设置动画的起始和结束...
本文将深入探讨Android中的两种视图动画——补间动画和帧动画,以及更为强大的属性动画的使用细节。 **补间动画(Tween Animation)** 补间动画是Android早期引入的一种简单动画形式,主要用于改变View的基本属性...
在Android中,动画可以分为两种主要类型:补间动画(Tween Animation)和帧动画(Frame Animation)。在这个项目中,我们可能会用到补间动画,因为它更适合模拟连续的平滑动作,比如小人的奔跑。 补间动画是通过...
在Android开发中,动画是提升用户体验、增加应用趣味性的重要元素。这个名为"数百种Android动画效果源码"的项目,旨在提供一个丰富的动画库,帮助开发者快速理解和应用各种动画效果。下面将详细介绍这个项目中可能...
在Android中,可以通过`AnimationDrawable`实现帧动画,适用于简单的2D动画场景。 4. **过渡动画(Transition Animation)** 自Android Lollipop(API level 21)起,过渡动画被引入,主要用于Activity和Fragment...
`RotateAnimation`是Android中实现旋转效果的专用动画类。它可以根据指定的初始角度和最终角度,使视图进行旋转。 1. 创建RotateAnimation 创建`RotateAnimation`对象,需要提供起始角度、结束角度、旋转中心X坐标...
在Android开发中,动画是提升用户体验的关键因素,它能让应用变得更加生动、有趣。这篇"Android动画学习总结---下"着重探讨了Android属性动画(Property Animation)的使用方法。属性动画系统是Android 3.0(API ...
在Android中,动画主要分为两种类型:补间动画(Tween Animation)和帧动画(Frame Animation)。补间动画用于改变视图的位置、大小、透明度等属性,而帧动画则是通过显示一系列静态图像来创建连续运动的效果。 1. ...
Android 平台提供了一套完整的...本文是第一部分原理篇,主要分析 Tween 动画的实现原理, 最后简单介绍在 Android 中如何通过播放 Gif 文件来实现动画。第二部分实例篇将在原理篇的基础上,向您展示一个动画实例的实现
这篇博客主要探讨了Android中的动画技术,并提供了相关资源,链接为。 Android动画主要分为两种类型:属性动画(Property Animation)和视图动画(View Animation)。视图动画是早期Android版本中的动画系统,主要...
下面我们将详细讨论如何在Android中实现这一特效。 首先,我们要了解Android动画的基础。Android提供了两种主要的动画类型:属性动画(Property Animation)和视图动画(View Animation)。属性动画是在API 11及...