当前位置:文档之家› 基于Android手机系统的3D桌面主题开发毕业论文

基于Android手机系统的3D桌面主题开发毕业论文

论文题目:基于Android手机系统的3D桌面主题开发

毕业论文(设计)原创性声明

本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。据我所知,除文中已经注明引用的内容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。

作者签名:日期:

毕业论文(设计)授权使用说明

本论文(设计)作者完全了解**学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。有权将论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被查阅。学校可以公布论文(设计)的全部或部分内容。保密的论文(设计)在解密后适用本规定。

作者签名:指导教师签名:

日期:日期:

注意事项

1.设计(论文)的内容包括:

1)封面(按教务处制定的标准封面格式制作)

2)原创性声明

3)中文摘要(300字左右)、关键词

4)外文摘要、关键词

5)目次页(附件不统一编入)

6)论文主体部分:引言(或绪论)、正文、结论

7)参考文献

8)致谢

9)附录(对论文支持必要时)

2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。

3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。

4.文字、图表要求:

1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写

2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画

3)毕业论文须用A4单面打印,论文50页以上的双面打印

4)图表应绘制于无格子的页面上

5)软件工程类课题应有程序清单,并提供电子文档

5.装订顺序

1)设计(论文)

2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订

3)其它

中文摘要

2007年,google公司1提出的安卓(Android)2智能手机操作系统,风靡全球,立即引发基于该系统的软件开发热潮。本论文主要是讨论与研究基于安卓智能手机操作系统桌面3d特效(模拟3D主题样式3与基于OpenGL ES的3D主题样式4)的开发及其性能优化,以期能对3D开发有更深入的理解,以便能提出3D 开发方面的见解。

模拟3D与基于OpenGL ES的3D主题样式都是通过修改Android Launcher 源码中的Workspace类来实现。区别在于两种主题样式以不同的转屏方式来实现Workspace子视图之间的跳转。在用户转屏时,模拟3D通过在同一屏幕上以固定的夹角、不同的视觉方向绘制两个相关的子视图图像,从而实现转屏效果。而基于OpenGL ES的3D主题样式则通过在3D场景上绘制正N棱体,棱体的每个侧面是相对应的Workspace子视图图像,用户通过选择不同的侧面来进入不同的子视图。

关键词:安卓,桌面主题,OpenGL ES,Launcher,3D,开发

1google公司官网.https://www.doczj.com/doc/3017613751.html,.2012-04-01

2安卓开发者官网.https://www.doczj.com/doc/3017613751.html,/index.html.2012-04-01

3本论文第3章将会介绍

4本论文第4章将会介绍

ABSTRACT

2007,google has developed the Android smartphone operating system, which swept the world, making software engineers to develop on this system. And this thesis is to discuss the development of 3d desktop(the simulate 3D desktop and the 3D desktop based on OpenGL ES) based on the Android smart phone operating system and its optimized performance, in order to have a deeper understanding of the 3D development and put forward the views in the field.

Both the simulate 3D desktop and the 3D desktop based on OpenGL ES are to modify the class named Workspace in the Android Launcher code. The difference is that this two desktop change screen in different ways to achieve the jump between Workspace child views. When changing screen, the simulate 3D desktop is to draw two images of the two related child views on the same screen at a fixed angle, a different visual direction. However, the 3D desktop based on OpenGL ES is to draw a N prism in the 3D scene, and each side of the prism is a corresponding image of the Workspace child view. Entering the corresponding child view of Workspace when user selects a side of the prism.

Key Words: Android , Desktop Themes, OpenGL ES,Launcher,3D,develop

目录

中文摘要 (1)

ABSTRACT (5)

目录 (6)

第1章引言 (8)

第2章关键技术介绍 (9)

2.1 JAVA反射机制 (9)

2.2 Android Launcher (9)

2.2.1 界面模型 (10)

2.2.2 触摸事件处理 (11)

2.2.3 Launcher开发 (12)

2.3 Opengl ES标准 (13)

2.3.1 Opengl标准简介 (13)

2.3.2 OpenGL ES管道 (14)

2.3.3 投影方式 (15)

2.3.4 光照效果 (17)

2.3.5 法向量 (18)

2.3.6 物体的材质 (19)

2.3.7 纹理贴图 (19)

第3章开发模拟3D 主题样式 (21)

3.1 说明与概述 (21)

3.2 解决方案 (21)

3.3 优化方案 (23)

第4章开发Opengl ES 3D主题样式 (25)

4.1 说明与概述 (25)

4.2 解决方案 (26)

4.2.1 坐标计算 (26)

4.2.1.1 方案一 (26)

4.2.1.2 方案二 (27)

4.2.1.3 比较方案 (29)

4.2.1.4 方案修正 (30)

4.2.2 镜像技术 (33)

4.3 优化方案 (40)

4.4 总结 (42)

参考文献 (44)

致谢 (45)

第1章引言

进入21世纪,信息技术高速发展。特别是移动互联网的高速发展,带领人们进入了“智能手机”时代。2007年,google公司提出的安卓智能手机操作系统,风靡全球,立即引发基于该系统的软件开发热潮,尤其是针对改善交互模式的手机主题开发。

由于移动设备硬件的不断发展升级,用户越来越渴望移动设备能有更好的用户体验。如在移动设备上实现各种3D效果等。但目前的移动设备硬件虽然有了一定的发展,可是对于运行高耗性能的3D效果等,还是力不从心。因此,现在市场上带有3D效果的软件都是通过在屏幕中以不同方向绘制图像而已,即模拟3D效果,并非真正的3D场景。

实际上,在手机这种计算能力仍然十分有限的设备上,绘制真正的3D场景(使用OpenGL ES标准)的确存在很大的瓶颈。主要是由于在三维场景到二维屏幕的转换过程需要大量的计算,而且这种计算需要重复地运行,可是移动设备难以承担这种计算负载。所以如何在手机系统上展现3D效果是一个十分值得研究的问题。另外对于OpenGL ES应用程序的性能优化更是一个值得研究的领域。

本论文讨论与研究基于Android智能手机操作系统桌面3d特效的开发及其性能优化,以期能对3D开发有更深入的理解,以便能提出3D开发方面的见解。

第2章关键技术介绍

2.1 JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够获知此类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法;这种动态获取信息以及动态调用对象方法的功能称为JAVA语言的反射机制。

反射是Java被认为是动态语言的一个非常重要的特性,它允许动态发现和绑定类、方法、字段,以及所有其他的由语言所产生的元素。也就是说,这类应用通过采用某种机制来实现对自己行为的描述和监测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义5。

Java反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理。

在本论文的工程中,Workspace类中通过java反射机制来实例化当前主题样式proxy,并在相应的方法中调用proxy的相应方法。利用反射机制实例化对象的主要代码为代码2.1。

代码2.1

2.2 Android Launcher

目前,由于Android桌面主题应用程序,与普通的应用程序不同,它是在系统启动时由系统进程加载;加之,其内部实现原理十分复杂,对触摸事件响应机制更是复杂。因此,一般开发此类应用程序都必须下载Android Launcher源码。

通过在Android官网上下载Android Launcher源码包,并解压到myeclipse 工程目录下,引入工程并添加相应的jar包,消除错误后,便可以进行开发(工程截图如图2.1)。

5尹松强傅鹂.java反射机制探究[J],2008年(第7卷第11期):P85-P85

图2.1 工程截图

在开发Android 主题前,必须对Android Launcher 有一个初步的认识。

2.2.1 界面模型

图2.2 Launcher 界面模型

图2.3 HomeScreen基本结构图

由于Launcher需要管理各种图标等,而Android自带的视图不足以实现如此复杂的界面。因此,Launcher中的界面元素大都是自定义视图。所以在开发Launcher之前必须更深入地了解其界面模型(如图2.2)。

Launcher界面模型的根视图是DragLayer(继承自FrameLayout)。而在根视图上workspace占了绝大部分的空间。

HomeScreen基本结构图(如图2.3)描述了绘制整个Launcher界面模型的类关系图。

2.2.2 触摸事件处理

由于Launcher接收到的触摸事件比较多(例如单击、长按、滑动等),处理逻辑也比较复杂,所以Launcher触摸事件处理机制采用根视图(DragLayer)统一分发处理。详细处理规则为首先父视图中的

onInterceptTouchEvent(MotionEvent)方法拦截所有的触摸事件,经过判断后分发给子视图。判断的规则如下:

1、MotionEvent.ACTION_DOWN事件首先会传递到onInterceptTouchEvent()方法

2、如果父视图的onInterceptTouchEvent(MotionEvent)方法在接收到MotionEvent.ACTION_DOWN事件处理完成之后返回 false,那么后续的

MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等事件将继续会先传递给该父视图,之后才和MotionEvent.ACTION_DOWN事件一起传递给下一级的目标子视图的onTouchEvent(MotionEvent)处理。

3、如果该父视图的onInterceptTouchEvent(MotionEvent)在接收到MotionEvent.ACTION_DOWN事件处理完成之后返回 true,那么后续的MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP等事件将不再传递给该父视图的onInterceptTouchEvent(MotionEvent),而是和

MotionEvent.ACTION_DOWN事件一起传递给该父视图的

onTouchEvent(MotionEvent)处理,而目标子视图将接收不到任何事件。

4、如果最终需要处理事件的视图的onTouchEvent(MotionEvent)返回false,那么该触摸事件将被传递至其上一层次的视图的

onTouchEvent(MotionEvent)处理。

5、如果最终需要处理事件的视图的onTouchEvent(MotionEvent)返回true,那么后续事件将可以继续传递给该视图的onTouchEvent(MotionEvent)处理。

2.2.3 Launcher开发

通过上面的介绍,对Launcher有了初步的了解。那如何进行Launcher开发呢?一般Launcher开发都是基于改善和修改以下几个方面:

1、转屏方式;

2、布局方式;

3、事件处理方式;

4、应用程序列表的展现方式;

本论文主要基于转屏方式的应用以及改善,改变系统默认的滑屏方式,以

3D转屏方式取而代之,体现了较好的用户体验。

Launcher转屏方式主要由Workspace类里决定和处理。Workspace类接收了Launcher传递过来的各种触摸事件,当Workspace接收到触摸事件时,首先交由onInterceptTouchEvent(MotionEvent)处理,处理规则如下:

1、如果接收到的是MotionEvent.ACTION_DOWN事件,那么就会把当前的触摸坐标记录为前一次触摸坐标。触摸状态改为RESET。

2、如果接收到的是MotionEvent.ACTION_MOVE事件,那么就计算当前触摸坐标与前一次触摸坐标是否超出了某个值。如果超出了,则把触摸状态改为SCROLLING。否则触摸状态保持不变。

3、如果接收到的是MotionEvent.ACTION_UP事件,那么就把触摸状态改为RESET,并更新壁纸。

4、最后,如果触摸状态为SCROLLING,则把当前及后续事件传递给

onTouchEvent(MotionEvent)处理;否则,onInterceptTouchEvent(MotionEvent)继续处理后续事件。

因此,当用户滑动屏幕的前后坐标差超过一定值时,所有事件都会传递给onTouchEvent(MotionEvent)处理。onTouchEvent(MotionEvent)方法处理事件规则如下:

1、如果接收到的是MotionEvent.ACTION_DOWN事件,那么就会把当前的触摸坐标记录为前一次触摸坐标。

2、如果接收到的是MotionEvent.ACTION_MOVE事件,那么就把当前的触摸坐标记录为前一次触摸坐标以及保持触摸状态不变,并按照某种方式进行转动屏幕。

3、如果接收到的是MotionEvent.ACTION_UP事件,那么就把触摸状态改为RESET,并绘制当前滑动到达的子视图。

4、最后,返回true,即把当前及后续事件传递给本方法处理。

所以,通过以上分析,可以得知:通过改变Workspace的

onTouchEvent(MotionEvent)方法处理MotionEvent.ACTION_MOVE事件的方式,就可以改变Launcher的转屏方式。为此,定义一个主题样式接口,如代码2.2。

代码2.2

2.3 Opengl ES标准

2.3.1 Opengl标准简介

图2.4 OpenGL和OpenGL ES之间的关系图

OpenGL ES(OpenGL for Embedded Systems)是OpenGL三维图形API的子集,定义了一个在移动平台上能够支持OpenGL最基本功能的精简标准,以适应如手机,PDA或其它消费者移动终端的显示系统。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。

2.3.2 OpenGL ES管道

大部分图形系统都可以比作工厂中的装配线或者称为管道(Pipeline)。前一道的输出作为下道工序的输入。主CPU发出一个绘图指令,对顶点数组进行指定的坐标变换或光照处理。顶点处理完成后,通过Rasterizer来生成像素信息,称为Fragments。对于Fragment 在经过Texture Processing, Color Sum ,Fog 等处理并将最终处理结果存放在内存中(称为FrameBuffer),最后在屏幕上把

图像显示出来。

图2.5 OpenGL ES管道的结构图

2.3.3 投影方式

在OpenGL ES中支持两种投影方式:正交投影和透视投影6。

所谓的正交投影是平行投影的一种,观察者的实现是平行的,不产生真实世界远大近小的透视效果。在正交投影中,可视的空间区域为长方体(正交投影产生的效果如图2.6)。

6吴亚峰苏亚光.Android 3D游戏开发技术详解与典型案例[M].北京:电子工业出版社.2011:P103–P113

图2.6:正交投影

而透视投影属于非平行投影,可视的空间区域为梯台。观察者的实现在远处是相交的,视线相交即为灭点。通过透视投影,可以产生现实世界中的近大远小的效果。因此使用透视投影可以得到更加真实的3D感受(透视投影产生的效果如图2.7)。

图2.7:透视投影

在本论文的工程中,使用透视投影,具体代码如代码2.3。

代码2.3

2.3.4 光照效果

光照使物体看起来更立体。如果没有光照,绝大多数物体看上去甚至不像三维物体。因此,光照对于三维物体来说十分重要。

在OpenGL ES 中,分别有两种光源产生光照效果:定向光和定位光。定向光对应的是光源在无穷远处的光,定向光在空间中的所有位置方向都是相同的。而定位光对应的是光源在某一具体位置的光。

同时,在设置光照效果时,需要设置光源的一些特性,如颜色。OpenGL ES 允许把与颜色相关的3个不同参数GL_AMBIENT

、GL_DIFFUSE 、GL_SPECULAR 与任何特定的光源相关联7。

ambient 即环境光,表示一个特定的光源在场景中所添加的环境光的RGBA 强度。在默认情况下,不存在环境光。

diffuse 即散射光,散射光来自于某个方向。因此,如果散射光从正面照射物体表面,它看起来就显得更亮一些。反之,如果它斜着从物体表面掠过,则看起来就显得暗一些。但是当散射光撞击物体表面时,它就会向四面八方均匀地发散。不管从哪个方向看,散射光看上去总是一样亮。来自某个特定位置或方向的任何光很可能具有散射成分。

specular 即镜面光,镜面光来自一个特定的方向,并且倾向于从表面向某个特定的方向反射。镜面光肉眼看起来是物体上最亮的地方。当然这与物体本身也有关系,如果是类似镜子的、光泽的金属等,则光线为全反射,整个物体都很明亮,而对于像石膏雕像地毯等,则几乎不存在镜面成分。

在本论文的工程中,光照效果设置的代码如代码2.4。

7 吴亚峰 苏亚光.Android 3D 游戏开发技术详解与典型案例[M].北京:电子工业出版社.2011:P119–P121

代码2.4

2.3.5 法向量

物体每个顶点的法向量决定了光照时的反射情况,如果没有为顶点设置法向量,光照系统也是不能正常工作的。物体每个顶点的法向量是指处于三维物体表面处的法线方向,其用一个向量来表示。OpenGL ES中向量用一个三元组来表示,格式为(x, y, z)8。

但由于一个三维坐标系中的点有可能在多个平面中,因此会有两种计算方法来计算该点的法向量,分别是面法向量和点平均法向量。

面法向量是指当立体物体中一个顶点位于某个三角形面上时,为其分配属于面的法向量。但很多情况下一个顶点并不只属于一个三角形面,而可能属于多个三角形面。而在OpenGL ES中不能给一个顶点分配多个法向量,因此一般采用的处理方法是此处的顶点属于几个面就在此处放置几个位置相同的顶点,并为这几个顶点分别指定属于面的法向量。

点平均法向量指当同一点隶属于多个面时,为其分配的是各个面法向量的平均值。如立方体中每个顶点属于3个面,因此每个顶点的法向量就是3个面法向量的平均值。

面法向量和点平均法向量各有其不同的使用场合。面法向量棱角分明,更适合实现本身就棱角分明的三维物体,如立方体,四棱锥等。点平均法向量过渡平滑,比较适合表面平滑、没有棱角的物体,如茶壶、圆柱面、球等9。

8吴亚峰苏亚光.Android 3D游戏开发技术详解与典型案例[M].北京:电子工业出版社.2011:P121

9吴亚峰苏亚光.Android 3D游戏开发技术详解与典型案例[M].北京:电子工业出版社.2011:P143–P146

2.3.6 物体的材质

设置材质的主要工作就是设置材质对于环境光、散射光、镜面光的发射能力,也就是说此安置能反射什么颜色的光。例如,白色的材质能发射所有颜色的光,红色的材质只能发射红色光。

代码2.5

在本论文的工程开发中,设置物体材质的代码如代码2.5。

2.3.7 纹理贴图

在三维场景中,经常需要把图片等图像信息显示出来,因此需要有一个机制能使二维图像在三维场景中展现,这就是纹理贴图。纹理映射允许将指定的纹理素材映射到三维物体指定的多边形面上。但OpenGL ES中仅支持三角形,因此指定纹理坐标时需要对图像进行切割。物体上的每一点对应一组纹理坐标s、t,在对纹理进行粘贴之前要根据其所应用的片段进行排列。对于二维的纹理图,纹理坐标在S和T方向上的范围是0.0~1.0,但是进行纹理贴图的物体没有坐标范围的限制。

但在应用开发中,有时候需要把一幅纹理图拉伸或缩小到目标面上,在目标面很大的情况下有三种解决方案:

1、将纹理拉大,这样的缺点是纹理显得非常不清楚,失去了原来清晰的效果,甚至可能变形。

2、将目标面分割为多个与纹理大小相似的矩形,再将纹理重复贴到被分割的目标上。这样做的缺点是不仅浪费了内存(需要额外存储大量的顶点信息),也浪费了开发人员宝贵的精力。

3、使用合理的纹理拉伸方式,使得纹理能够根据目标平面的大小自动重复,这样既不失去纹理图的效果,也节省了内存,提高了开发效率。这种方案在很多情况下无疑是最好的解决办法,要想实现这种纹理粘贴方式,只需要做以下两方面工作:

(1)将纹理的GL_TEXTURE_WRAP_S与GL_TEXTURE_WRAP_T属性值设置为

GL_REPEAT而不是GL_CLAMP_TO_EDGE。

(2)设置纹理坐标时纹理坐标的取值范围不再是0~1,而是0~n,n表示希望纹理重复的次数10。

在本论文的工程开发中,就是使用了第三种解决方案,具体代码如代码2.6。

代码2.6

10吴亚峰苏亚光.Android 3D游戏开发技术详解与典型案例[M].北京:电子工业出版社.2011:P170–P171

相关主题
相关文档 最新文档