`

[Android 界面] 分析android动画模块

 
阅读更多

分析android动画模块
作者: haiyang08101

日期: 2009-03-07
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);

    }

}

 

2
2
分享到:
评论

相关推荐

    Android Fragment切换动画

    在Android应用开发中,Fragment是UI组件的一种,它允许我们构建可重用的模块化界面。Fragment可以在Activity中动态添加、删除或替换,这在设计适应不同屏幕尺寸和配置的应用时非常有用。当我们想要增强用户体验,使...

    Android下Fragment的动画切换效果

    在Android开发中,Fragment是应用程序界面的一个模块化组件,它可以在Activity中添加、删除或替换。Fragment提供了在不同屏幕尺寸和配置变化下管理用户界面的能力。本教程将深入探讨如何在Android应用程序中实现...

    Android 界面滑动效果

    总之,实现“Android 界面滑动效果”涉及了手势识别、滚动视图、滑动布局、事件处理和动画等多个方面。通过深入理解和熟练运用这些技术,开发者可以创造出丰富多样的滑动交互,提升Android应用的用户体验。

    Android动画、界面切换、特效、功能模块设计及代码

    ### Android 动画、界面切换、特效与功能模块设计 #### 概述 在现代移动应用开发中,用户界面的设计不仅是提升用户体验的关键因素之一,也是展现应用独特风格的重要手段。对于Android开发者而言,掌握如何使用各种...

    Android代码-本游戏中主要包括三个模块界面模块运动控制模块和奖励物品模块.rar

    本项目主要涵盖了三个核心模块:界面模块、运动控制模块和奖励物品模块。这些模块是构建一款完整游戏的基础架构,下面将对这三个模块进行详细的介绍。 首先,界面模块是游戏与用户交互的窗口。在Android中,界面...

    android界面开发笔记相关代码

    总结来说,Android界面开发涵盖了XML布局设计、布局管理器、主题与样式、事件监听、Fragment和动画等多个方面。理解并掌握这些知识点,对于构建高效、美观的Android应用至关重要。提供的"android开发笔记(界面)....

    安卓Android源码——UI界面源码.zip

    10. **Fragment**:Fragment是Android中可重用的UI模块,常用于支持多屏设备和屏幕旋转。一个Activity可以包含多个Fragment,形成复杂的界面结构。 11. **ConstraintLayout**:这是Android的一种布局管理器,可以...

    Android代码-首界面和滑动界面源码.zip

    通过分析和学习这个源码,开发者可以加深对Android界面设计和交互的理解,提升自己的开发技能。同时,这也是一个很好的实践案例,有助于将理论知识转化为实际应用。在阅读源码时,注意代码的组织结构、命名规范以及...

    Android_动画效果

    #### 二、Android动画类型 Android的`animation`模块主要包括以下四种类型的动画: 1. **透明度动画(Alpha Animation)**:用于改变视图的透明度。 2. **尺寸伸缩动画(Scale Animation)**:用于改变视图的尺寸...

    Android窗口界面美化例子.rar

    12. **Fragment**:Fragment是可插入Activity的模块化组件,用于构建动态和复杂的界面。它们可以独立生存,也可以在Activity之间交换。 以上知识都是Android UI界面美化所涉及的基础概念。下载提供的源代码实例,将...

    数百种Android动画效果源码

    1. **Android动画种类**:项目中可能涵盖了诸如视图动画(View Animation)、属性动画(Property Animation)、过渡动画(Transition Animation)等不同类型的Android动画。视图动画包括Alpha、Scale、Translate和...

    android studio仿微信主界面

    首先,我们需要理解Android Studio是Google推出的官方Android应用开发集成开发环境(IDE),它提供了丰富的功能,包括代码编辑、调试、性能分析等,使得开发者能高效地构建高质量的Android应用。 **ViewPager组件**...

    android仿qq主界面

    4. **动画效果**:为了使界面更生动,我们可能需要添加一些过渡动画,如Activity之间的滑动切换、View的淡入淡出等,这可以通过Android的Transition API或者自定义动画实现。 5. **权限管理**:如果应用需要访问...

    android首界面和滑动界面源码

    总的来说,创建一个具有滑动效果的Android首界面需要结合`SplashScreen`、`ViewPager`、动画效果以及适当的活动管理。理解并熟练运用这些技术,能够帮助你构建出更加吸引用户、交互体验优秀的Android应用。

    Android开发150套界面资源.zip

    7. **Material Design**:Google推出的Material Design设计语言是目前Android开发中的主流设计指南,它提供了一套完整的视觉、交互和动画规范,有助于创建现代、统一的界面。 8. **图标设计**:图标在界面中起到...

    android仿QQ界面

    总的来说,"android仿QQ界面"项目涵盖了Android开发的多个方面,包括界面设计、手势交互、数据管理、网络通信、动画效果等,对于提升开发者全面的Android技能非常有帮助。在实际开发过程中,需要结合Android的官方...

    Android-Android双波浪加载动画

    "Android双波浪加载动画"是一种常见且引人入胜的视觉元素,常用于应用程序的加载界面或者进度指示。这种动画通常由两个相互重叠的波浪图形组成,它们在屏幕上上下起伏,形成一种动态的流动效果,给用户带来生动而...

    android界面设计高仿京东

    总之,高仿京东的Android界面设计涵盖了众多知识点,包括但不限于UI设计原则、布局管理、自定义控件、动画效果、网络请求、数据持久化等。开发者可以通过分析和实践,逐步提高自己的设计和开发能力,创造出更加符合...

    android仿360界面实现

    TestTeXiao5可能是该项目的一个测试模块或者相关代码文件,具体实现可能包括界面组件的测试、动画效果的调试等。通过不断测试和迭代,可以逐步完善和优化这个仿360界面的实现。 总之,实现一个仿360界面的Android...

    Android旋转菜单动画

    在提供的`CustomView_Youku`文件中,可能包含了实现这一功能的源代码示例,你可以通过学习和分析这个代码,更深入地理解Android旋转动画的实现细节。通过这样的实践,你将能够熟练地为自己的应用添加各种动态效果,...

Global site tag (gtag.js) - Google Analytics