- 浏览: 270892 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
tonytony3:
THANK YOU
Android多级树形菜单的实现 -
haiyang08101:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
求求你帮帮我:
怎么把我的空格也当成节点处理了?
java对xml文件做增删改查 -
求求你帮帮我:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
lpj13579:
多谢分享,学习学习
高仿小米盒子UI效果实现
分析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); } }
发表评论
-
Android 三大图片加载框架比较
2016-11-30 10:31 10781.哪三大图片加载框架? 1) Pi ... -
仿微信小视屏拍摄的进度条/自定义的progressBar的样式。
2016-08-20 00:25 1020今天有个需求,就是需要倒计时的进度条,样式参考微信小视屏拍摄 ... -
android 闹钟定时任务 AlarmManager
2016-06-02 13:41 1821直接上代码 package com.exampl ... -
android应用实现重启系统
2016-06-02 13:33 35121.在AndroidManifest.xml文件的manif ... -
android 每天定时提醒功能实现
2016-06-01 22:42 0android要实现定时的功 ... -
Java Calendar 类的时间操作
2016-06-01 21:02 661ava Calendar 类时间操作,这也许是创建日历和管理 ... -
android中fragment和activity之间相互通信
2014-11-13 16:25 1433在用到fragment的时候,老是会遇到一个问题,就是fra ... -
墨迹天气上下滑动viewpager
2014-11-04 17:15 742墨迹天气上下滑动viewpager -
Android杂谈--打开文件的Intent及使用
2014-10-25 13:03 639在写文件管理系统时会用到各种打开不同格式的文件的需求,由于A ... -
获取Android签名证书的sha1值
2014-08-23 23:14 657前言:今天开始研 ... -
java中Keytool的使用总结
2014-08-23 22:40 557J2SDK提供了keytool命令行工具,可以根据指定的参数 ... -
android获取versionName和versionCode
2014-07-08 18:02 733<TextView android:textSize= ... -
Android如何防止apk程序被反编译
2014-07-08 17:22 703作为Android应用开发者,不得不面对一个尴尬的局面,就是 ... -
在GridView中实现单选或多选功能
2014-06-26 13:08 816由于项目需要,要用到GridView实现多选功能,在网上搜 ... -
Android中Tween动画和Frame动画实例
2014-06-26 10:46 721Animation主要有两种动画模式:Tween动画和Fra ... -
android 禁用和开启四大组件的方法(setComponentEnabledSetting )
2014-06-19 15:26 0为什么要关闭组件? 在用到组件时,有时候我们可能暂时性的不使 ... -
android MD5校验码的生成与算法实现
2014-06-17 10:58 880在Java中,java.security.Mes ... -
android 自动检测版本升级
2014-06-15 14:10 382这里我用别的app代替了,简单省事,正常的话,你要对你的 ... -
layout左右平滑控制.
2014-04-30 09:41 608<?xml version="1.0&quo ... -
android让你的TabHost滑动起来
2014-04-22 22:13 815在Android应用中,一般TabActivity和若干个T ...
相关推荐
在Android应用开发中,Fragment是UI组件的一种,它允许我们构建可重用的模块化界面。Fragment可以在Activity中动态添加、删除或替换,这在设计适应不同屏幕尺寸和配置的应用时非常有用。当我们想要增强用户体验,使...
在Android开发中,Fragment是应用程序界面的一个模块化组件,它可以在Activity中添加、删除或替换。Fragment提供了在不同屏幕尺寸和配置变化下管理用户界面的能力。本教程将深入探讨如何在Android应用程序中实现...
总之,实现“Android 界面滑动效果”涉及了手势识别、滚动视图、滑动布局、事件处理和动画等多个方面。通过深入理解和熟练运用这些技术,开发者可以创造出丰富多样的滑动交互,提升Android应用的用户体验。
### Android 动画、界面切换、特效与功能模块设计 #### 概述 在现代移动应用开发中,用户界面的设计不仅是提升用户体验的关键因素之一,也是展现应用独特风格的重要手段。对于Android开发者而言,掌握如何使用各种...
本项目主要涵盖了三个核心模块:界面模块、运动控制模块和奖励物品模块。这些模块是构建一款完整游戏的基础架构,下面将对这三个模块进行详细的介绍。 首先,界面模块是游戏与用户交互的窗口。在Android中,界面...
总结来说,Android界面开发涵盖了XML布局设计、布局管理器、主题与样式、事件监听、Fragment和动画等多个方面。理解并掌握这些知识点,对于构建高效、美观的Android应用至关重要。提供的"android开发笔记(界面)....
10. **Fragment**:Fragment是Android中可重用的UI模块,常用于支持多屏设备和屏幕旋转。一个Activity可以包含多个Fragment,形成复杂的界面结构。 11. **ConstraintLayout**:这是Android的一种布局管理器,可以...
通过分析和学习这个源码,开发者可以加深对Android界面设计和交互的理解,提升自己的开发技能。同时,这也是一个很好的实践案例,有助于将理论知识转化为实际应用。在阅读源码时,注意代码的组织结构、命名规范以及...
#### 二、Android动画类型 Android的`animation`模块主要包括以下四种类型的动画: 1. **透明度动画(Alpha Animation)**:用于改变视图的透明度。 2. **尺寸伸缩动画(Scale Animation)**:用于改变视图的尺寸...
12. **Fragment**:Fragment是可插入Activity的模块化组件,用于构建动态和复杂的界面。它们可以独立生存,也可以在Activity之间交换。 以上知识都是Android UI界面美化所涉及的基础概念。下载提供的源代码实例,将...
1. **Android动画种类**:项目中可能涵盖了诸如视图动画(View Animation)、属性动画(Property Animation)、过渡动画(Transition Animation)等不同类型的Android动画。视图动画包括Alpha、Scale、Translate和...
首先,我们需要理解Android Studio是Google推出的官方Android应用开发集成开发环境(IDE),它提供了丰富的功能,包括代码编辑、调试、性能分析等,使得开发者能高效地构建高质量的Android应用。 **ViewPager组件**...
4. **动画效果**:为了使界面更生动,我们可能需要添加一些过渡动画,如Activity之间的滑动切换、View的淡入淡出等,这可以通过Android的Transition API或者自定义动画实现。 5. **权限管理**:如果应用需要访问...
总的来说,创建一个具有滑动效果的Android首界面需要结合`SplashScreen`、`ViewPager`、动画效果以及适当的活动管理。理解并熟练运用这些技术,能够帮助你构建出更加吸引用户、交互体验优秀的Android应用。
7. **Material Design**:Google推出的Material Design设计语言是目前Android开发中的主流设计指南,它提供了一套完整的视觉、交互和动画规范,有助于创建现代、统一的界面。 8. **图标设计**:图标在界面中起到...
总的来说,"android仿QQ界面"项目涵盖了Android开发的多个方面,包括界面设计、手势交互、数据管理、网络通信、动画效果等,对于提升开发者全面的Android技能非常有帮助。在实际开发过程中,需要结合Android的官方...
"Android双波浪加载动画"是一种常见且引人入胜的视觉元素,常用于应用程序的加载界面或者进度指示。这种动画通常由两个相互重叠的波浪图形组成,它们在屏幕上上下起伏,形成一种动态的流动效果,给用户带来生动而...
总之,高仿京东的Android界面设计涵盖了众多知识点,包括但不限于UI设计原则、布局管理、自定义控件、动画效果、网络请求、数据持久化等。开发者可以通过分析和实践,逐步提高自己的设计和开发能力,创造出更加符合...
TestTeXiao5可能是该项目的一个测试模块或者相关代码文件,具体实现可能包括界面组件的测试、动画效果的调试等。通过不断测试和迭代,可以逐步完善和优化这个仿360界面的实现。 总之,实现一个仿360界面的Android...
在提供的`CustomView_Youku`文件中,可能包含了实现这一功能的源代码示例,你可以通过学习和分析这个代码,更深入地理解Android旋转动画的实现细节。通过这样的实践,你将能够熟练地为自己的应用添加各种动态效果,...