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

上传人:仙人指路1688 文档编号:2393995 上传时间:2023-02-17 格式:DOC 页数:41 大小:2.52MB
返回 下载 相关 举报
基于Android手机系统的3D桌面主题开发毕业论文.doc_第1页
第1页 / 共41页
基于Android手机系统的3D桌面主题开发毕业论文.doc_第2页
第2页 / 共41页
基于Android手机系统的3D桌面主题开发毕业论文.doc_第3页
第3页 / 共41页
基于Android手机系统的3D桌面主题开发毕业论文.doc_第4页
第4页 / 共41页
基于Android手机系统的3D桌面主题开发毕业论文.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《基于Android手机系统的3D桌面主题开发毕业论文.doc》由会员分享,可在线阅读,更多相关《基于Android手机系统的3D桌面主题开发毕业论文.doc(41页珍藏版)》请在三一办公上搜索。

1、论文题目:基于Android手机系统的3D桌面主题开发 中文摘要2007年,google公司 google公司官网.2012-04-01提出的安卓(Android) 安卓开发者官网.智能手机操作系统,风靡全球,立即引发基于该系统的软件开发热潮。本论文主要是讨论与研究基于安卓智能手机操作系统桌面3d特效(模拟3D主题样式 本论文第3章将会介绍与基于OpenGL ES的3D主题样式 本论文第4章将会介绍)的开发及其性能优化,以期能对3D开发有更深入的理解,以便能提出3D开发方面的见解。模拟3D与基于OpenGL ES的3D主题样式都是通过修改Android Launcher源码中的Workspac

2、e类来实现。区别在于两种主题样式以不同的转屏方式来实现Workspace子视图之间的跳转。在用户转屏时,模拟3D通过在同一屏幕上以固定的夹角、不同的视觉方向绘制两个相关的子视图图像,从而实现转屏效果。而基于OpenGL ES的3D主题样式则通过在3D场景上绘制正N棱体,棱体的每个侧面是相对应的Workspace子视图图像,用户通过选择不同的侧面来进入不同的子视图。关键词:安卓,桌面主题,OpenGL ES,Launcher,3D,开发ABSTRACT2007,google has developed the Android smartphone operating system, which

3、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

4、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 j

5、ump 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 t

6、he 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目录中文摘要1ABSTRACT3目录4第1章 引言6第2章 关键技术介绍72.1 JAVA反射机制72.2 Android Launcher72.2.1 界面模型8

7、2.2.2 触摸事件处理92.2.3 Launcher开发102.3 Opengl ES标准112.3.1 Opengl标准简介112.3.2 OpenGL ES管道122.3.3 投影方式122.3.4 光照效果142.3.5 法向量152.3.6 物体的材质152.3.7 纹理贴图16第3章 开发模拟3D 主题样式183.1 说明与概述183.2 解决方案183.3 优化方案20第4章 开发Opengl ES 3D主题样式224.1 说明与概述224.2 解决方案234.2.1 坐标计算234.2.1.1 方案一234.2.1.2 方案二244.2.1.3 比较方案264.2.1.4 方案

8、修正274.2.2 镜像技术294.3 优化方案364.4 总结38参考文献40致 谢41第1章 引言进入21世纪,信息技术高速发展。特别是移动互联网的高速发展,带领人们进入了“智能手机”时代。2007年,google公司提出的安卓智能手机操作系统,风靡全球,立即引发基于该系统的软件开发热潮,尤其是针对改善交互模式的手机主题开发。由于移动设备硬件的不断发展升级,用户越来越渴望移动设备能有更好的用户体验。如在移动设备上实现各种3D效果等。但目前的移动设备硬件虽然有了一定的发展,可是对于运行高耗性能的3D效果等,还是力不从心。因此,现在市场上带有3D效果的软件都是通过在屏幕中以不同方向绘制图像而已

9、,即模拟3D效果,并非真正的3D场景。实际上,在手机这种计算能力仍然十分有限的设备上,绘制真正的3D场景(使用OpenGL ES标准)的确存在很大的瓶颈。主要是由于在三维场景到二维屏幕的转换过程需要大量的计算,而且这种计算需要重复地运行,可是移动设备难以承担这种计算负载。所以如何在手机系统上展现3D效果是一个十分值得研究的问题。另外对于OpenGL ES应用程序的性能优化更是一个值得研究的领域。本论文讨论与研究基于Android智能手机操作系统桌面3d特效的开发及其性能优化,以期能对3D开发有更深入的理解,以便能提出3D开发方面的见解。第2章 关键技术介绍2.1 JAVA反射机制JAVA反射机

10、制是在运行状态中,对于任意一个类,都能够获知此类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法;这种动态获取信息以及动态调用对象方法的功能称为JAVA语言的反射机制。反射是Java被认为是动态语言的一个非常重要的特性,它允许动态发现和绑定类、方法、字段,以及所有其他的由语言所产生的元素。也就是说,这类应用通过采用某种机制来实现对自己行为的描述和监测, 并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义 尹松强 傅鹂.java反射机制探究J,2008年(第7卷第11期):P85-P85。Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行

11、时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。在本论文的工程中,Workspace类中通过java反射机制来实例化当前主题样式proxy,并在相应的方法中调用proxy的相应方法。利用反射机制实例化对象的主要代码为代码2.1。String class_name = com.theme.workspace.style.WorkspaceStyle_Proxy_ + style;workspaceProxy = (WorkspaceProxy) Class.forName(class_name).getConstructor(W

12、orkspace.class).newInstance(this);代码2.12.2 Android Launcher目前,由于Android桌面主题应用程序,与普通的应用程序不同,它是在系统启动时由系统进程加载;加之,其内部实现原理十分复杂,对触摸事件响应机制更是复杂。因此,一般开发此类应用程序都必须下载Android Launcher源码。通过在Android官网上下载Android Launcher源码包,并解压到myeclipse工程目录下,引入工程并添加相应的jar包,消除错误后,便可以进行开发(工程截图如图2.1)。图2.1 工程截图在开发Android主题前,必须对Android

13、 Launcher有一个初步的认识。2.2.1 界面模型CellLayout(由N个cellLayout组成的workspace)状态栏垃圾桶图2.2 Launcher界面模型com.android.launcher. Workspace(ViewGroup)com.android.launcher. CellLayout(ViewGroup)com.android.launcher.DragLayer(FrameLayout)SlidingDrawercom.android.launcher.DeleteZone(FrameLayout)com.android.launcher. CellL

14、ayout(ViewGroup)com.android.launcher. CellLayout(ViewGroup)com.android.launcher. HandlerView(ImageView)com.android.launcher. AllAppsGirdView(GirdView)图2.3 HomeScreen基本结构图由于Launcher需要管理各种图标等,而Android自带的视图不足以实现如此复杂的界面。因此,Launcher中的界面元素大都是自定义视图。所以在开发Launcher之前必须更深入地了解其界面模型(如图2.2)。Launcher界面模型的根视图是DragL

15、ayer(继承自FrameLayout)。而在根视图上workspace占了绝大部分的空间。HomeScreen基本结构图(如图2.3)描述了绘制整个Launcher界面模型的类关系图。2.2.2 触摸事件处理由于Launcher接收到的触摸事件比较多(例如单击、长按、滑动等),处理逻辑也比较复杂,所以Launcher触摸事件处理机制采用根视图(DragLayer)统一分发处理。详细处理规则为首先父视图中的onInterceptTouchEvent(MotionEvent)方法拦截所有的触摸事件,经过判断后分发给子视图。判断的规则如下:1、MotionEvent.ACTION_DOWN事件首先

16、会传递到onInterceptTouchEvent()方法2、如果父视图的onInterceptTouchEvent(MotionEvent)方法在接收到MotionEvent.ACTION_DOWN事件处理完成之后返回 false,那么后续的MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等事件将继续会先传递给该父视图,之后才和MotionEvent.ACTION_DOWN事件一起传递给下一级的目标子视图的onTouchEvent(MotionEvent)处理。3、如果该父视图的onInterceptTouchEvent(MotionEvent)在接

17、收到MotionEvent.ACTION_DOWN事件处理完成之后返回 true,那么后续的MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP等事件将不再传递给该父视图的onInterceptTouchEvent(MotionEvent),而是和MotionEvent.ACTION_DOWN事件一起传递给该父视图的onTouchEvent(MotionEvent)处理,而目标子视图将接收不到任何事件。4、如果最终需要处理事件的视图的onTouchEvent(MotionEvent)返回false,那么该触摸事件将被传递至其上一层次的视图的onTouch

18、Event(MotionEvent)处理。5、如果最终需要处理事件的视图的onTouchEvent(MotionEvent)返回true,那么后续事件将可以继续传递给该视图的onTouchEvent(MotionEvent)处理。2.2.3 Launcher开发通过上面的介绍,对Launcher有了初步的了解。那如何进行Launcher开发呢?一般Launcher开发都是基于改善和修改以下几个方面:1、转屏方式;2、布局方式;3、事件处理方式;4、应用程序列表的展现方式;本论文主要基于转屏方式的应用以及改善,改变系统默认的滑屏方式,以3D转屏方式取而代之,体现了较好的用户体验。Launcher

19、转屏方式主要由Workspace类里决定和处理。Workspace类接收了Launcher传递过来的各种触摸事件,当Workspace接收到触摸事件时,首先交由onInterceptTouchEvent(MotionEvent)处理,处理规则如下:1、如果接收到的是MotionEvent.ACTION_DOWN事件,那么就会把当前的触摸坐标记录为前一次触摸坐标。触摸状态改为RESET。2、如果接收到的是MotionEvent.ACTION_MOVE事件,那么就计算当前触摸坐标与前一次触摸坐标是否超出了某个值。如果超出了,则把触摸状态改为SCROLLING。否则触摸状态保持不变。3、如果接收到的

20、是MotionEvent.ACTION_UP事件,那么就把触摸状态改为RESET,并更新壁纸。4、最后,如果触摸状态为SCROLLING,则把当前及后续事件传递给onTouchEvent(MotionEvent)处理;否则,onInterceptTouchEvent(MotionEvent)继续处理后续事件。因此,当用户滑动屏幕的前后坐标差超过一定值时,所有事件都会传递给onTouchEvent(MotionEvent)处理。onTouchEvent(MotionEvent)方法处理事件规则如下:1、如果接收到的是MotionEvent.ACTION_DOWN事件,那么就会把当前的触摸坐标记录

21、为前一次触摸坐标。2、如果接收到的是MotionEvent.ACTION_MOVE事件,那么就把当前的触摸坐标记录为前一次触摸坐标以及保持触摸状态不变,并按照某种方式进行转动屏幕。3、如果接收到的是MotionEvent.ACTION_UP事件,那么就把触摸状态改为RESET,并绘制当前滑动到达的子视图。4、最后,返回true,即把当前及后续事件传递给本方法处理。所以,通过以上分析,可以得知:通过改变Workspace的onTouchEvent(MotionEvent)方法处理MotionEvent.ACTION_MOVE事件的方式,就可以改变Launcher的转屏方式。为此,定义一个主题样式

22、接口,如代码2.2。/*主题样式接口*/public interface WorkspaceProxy void dispatchDraw(Canvas canvas);/* 绘制屏幕*/boolean onInterceptTouchEvent(MotionEvent motionEvent);/*拦截所有的触摸事件*/boolean onTouchEvent(MotionEvent motionEvent); /*处理传递过来的所有触摸事件*/void destroy();/*释放资源*/代码2.22.3 Opengl ES标准2.3.1 Opengl标准简介图2.4 OpenGL和Ope

23、nGL ES之间的关系图OpenGL ES(OpenGL for Embedded Systems)是OpenGL三维图形API的子集,定义了一个在移动平台上能够支持OpenGL最基本功能的精简标准,以适应如手机,PDA或其它消费者移动终端的显示系统。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。2.3.2 OpenGL ES管道大部分图形系统都可以比作工厂中的装配线或者称为管道(Pipeline)。前一道的输出作为下道工序的输入。主CPU发出一个绘图指令,对顶点数组进行指定的坐标变换或光照处理。顶点处理完成后,通过Ra

24、sterizer来生成像素信息,称为Fragments。对于Fragment 在经过Texture Processing, Color Sum ,Fog 等处理并将最终处理结果存放在内存中(称为FrameBuffer),最后在屏幕上把图像显示出来。图2.5 OpenGL ES管道的结构图2.3.3 投影方式在OpenGL ES中支持两种投影方式:正交投影和透视投影 吴亚峰 苏亚光.Android 3D游戏开发技术详解与典型案例M.北京:电子工业出版社.2011:P103P113。所谓的正交投影是平行投影的一种,观察者的实现是平行的,不产生真实世界远大近小的透视效果。在正交投影中,可视的空间区域

25、为长方体(正交投影产生的效果如图2.6)。图2.6:正交投影而透视投影属于非平行投影,可视的空间区域为梯台。观察者的实现在远处是相交的,视线相交即为灭点。通过透视投影,可以产生现实世界中的近大远小的效果。因此使用透视投影可以得到更加真实的3D感受(透视投影产生的效果如图2.7)。图2.7:透视投影在本论文的工程中,使用透视投影,具体代码如代码2.3。public void onSurfaceChanged(GL10 gl, int width, int height) 省略部分代码/* 计算投影参数 */GLU.gluPerspective(gl, 15.0f, ratio, 0.8f, 10

26、0.0f); / 投影矩阵参数:可视体省略部分代码代码2.32.3.4 光照效果光照使物体看起来更立体。如果没有光照,绝大多数物体看上去甚至不像三维物体。因此,光照对于三维物体来说十分重要。在OpenGL ES中,分别有两种光源产生光照效果:定向光和定位光。定向光对应的是光源在无穷远处的光,定向光在空间中的所有位置方向都是相同的。而定位光对应的是光源在某一具体位置的光。同时,在设置光照效果时,需要设置光源的一些特性,如颜色。OpenGL ES允许把与颜色相关的3个不同参数GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR与任何特定的光源相关联 吴亚峰 苏亚光.Android 3

27、D游戏开发技术详解与典型案例M.北京:电子工业出版社.2011:P119P121。ambient即环境光,表示一个特定的光源在场景中所添加的环境光的RGBA强度。在默认情况下,不存在环境光。diffuse即散射光,散射光来自于某个方向。因此,如果散射光从正面照射物体表面,它看起来就显得更亮一些。反之,如果它斜着从物体表面掠过,则看起来就显得暗一些。但是当散射光撞击物体表面时,它就会向四面八方均匀地发散。不管从哪个方向看,散射光看上去总是一样亮。来自某个特定位置或方向的任何光很可能具有散射成分。specular即镜面光,镜面光来自一个特定的方向,并且倾向于从表面向某个特定的方向反射。镜面光肉眼看

28、起来是物体上最亮的地方。当然这与物体本身也有关系,如果是类似镜子的、光泽的金属等,则光线为全反射,整个物体都很明亮,而对于像石膏雕像地毯等,则几乎不存在镜面成分。在本论文的工程中,光照效果设置的代码如代码2.4。/* * 初始化灯光效果 */private void initLight(GL10 gl) gl.glEnable(GL10.GL_LIGHT0); / 打开0号灯float ambientParams = 0.3f, 0.3f, 0.3f, 1.0f ; / 环境光设置gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientPara

29、ms, 0);float diffuseParams = 0.6f, 0.6f, 0.6f, 1.0f ; / 散射光设置gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffuseParams, 0);float specularParams = 1.0f, 1.0f, 1.0f, 1.0f ; / 反射光设置gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specularParams, 0);float positionParams = cameraX, 0, cameraZ, 0 ; / 最后的参

30、数表示定向光(0)或定位光(1)gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, positionParams, 0);代码2.42.3.5 法向量物体每个顶点的法向量决定了光照时的反射情况,如果没有为顶点设置法向量,光照系统也是不能正常工作的。物体每个顶点的法向量是指处于三维物体表面处的法线方向,其用一个向量来表示。OpenGL ES中向量用一个三元组来表示,格式为(x, y, z) 吴亚峰 苏亚光.Android 3D游戏开发技术详解与典型案例M.北京:电子工业出版社.2011:P121。但由于一个三维坐标系中的点有可能在多个平面中,因此会有两种

31、计算方法来计算该点的法向量,分别是面法向量和点平均法向量。面法向量是指当立体物体中一个顶点位于某个三角形面上时,为其分配属于面的法向量。但很多情况下一个顶点并不只属于一个三角形面,而可能属于多个三角形面。而在OpenGL ES中不能给一个顶点分配多个法向量,因此一般采用的处理方法是此处的顶点属于几个面就在此处放置几个位置相同的顶点,并为这几个顶点分别指定属于面的法向量。点平均法向量指当同一点隶属于多个面时,为其分配的是各个面法向量的平均值。如立方体中每个顶点属于3个面,因此每个顶点的法向量就是3个面法向量的平均值。面法向量和点平均法向量各有其不同的使用场合。面法向量棱角分明,更适合实现本身就棱

32、角分明的三维物体,如立方体,四棱锥等。点平均法向量过渡平滑,比较适合表面平滑、没有棱角的物体,如茶壶、圆柱面、球等 吴亚峰 苏亚光.Android 3D游戏开发技术详解与典型案例M.北京:电子工业出版社.2011:P143P146。2.3.6 物体的材质设置材质的主要工作就是设置材质对于环境光、散射光、镜面光的发射能力,也就是说此安置能反射什么颜色的光。例如,白色的材质能发射所有颜色的光,红色的材质只能发射红色光。private void initMaterialWhite(GL10 gl) float ambientMaterial = 0.4f, 0.4f, 0.4f, 1.0f ; /环

33、境光为白色材质gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,ambientMaterial, 0);float diffuseMaterial = 0.8f, 0.8f, 0.8f, 1.0f ; /散射光为白色材质gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE,diffuseMaterial, 0);float specularMaterial = 1.0f, 1.0f, 1.0f, 1.0f ; /高光材质为白色gl.glMaterialfv(GL10.GL_F

34、RONT_AND_BACK, GL10.GL_SPECULAR,specularMaterial, 0);float shininessMaterial = 1.5f ; / 高光反射区域,数越大高亮区域越小、越暗gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS,shininessMaterial, 0);代码2.5在本论文的工程开发中,设置物体材质的代码如代码2.5。2.3.7 纹理贴图在三维场景中,经常需要把图片等图像信息显示出来,因此需要有一个机制能使二维图像在三维场景中展现,这就是纹理贴图。纹理映射允许将指定的纹理素材映

35、射到三维物体指定的多边形面上。但OpenGL ES中仅支持三角形,因此指定纹理坐标时需要对图像进行切割。物体上的每一点对应一组纹理坐标s、t,在对纹理进行粘贴之前要根据其所应用的片段进行排列。对于二维的纹理图,纹理坐标在S和T方向上的范围是0.01.0,但是进行纹理贴图的物体没有坐标范围的限制。但在应用开发中,有时候需要把一幅纹理图拉伸或缩小到目标面上,在目标面很大的情况下有三种解决方案:1、将纹理拉大,这样的缺点是纹理显得非常不清楚,失去了原来清晰的效果,甚至可能变形。2、将目标面分割为多个与纹理大小相似的矩形,再将纹理重复贴到被分割的目标上。这样做的缺点是不仅浪费了内存(需要额外存储大量的

36、顶点信息),也浪费了开发人员宝贵的精力。3、使用合理的纹理拉伸方式,使得纹理能够根据目标平面的大小自动重复,这样既不失去纹理图的效果,也节省了内存,提高了开发效率。这种方案在很多情况下无疑是最好的解决办法,要想实现这种纹理粘贴方式,只需要做以下两方面工作:(1)将纹理的GL_TEXTURE_WRAP_S与GL_TEXTURE_WRAP_T属性值设置为GL_REPEAT而不是GL_CLAMP_TO_EDGE。(2)设置纹理坐标时纹理坐标的取值范围不再是01,而是0n,n表示希望纹理重复的次数 吴亚峰 苏亚光.Android 3D游戏开发技术详解与典型案例M.北京:电子工业出版社.2011:P17

37、0P171。在本论文的工程开发中,就是使用了第三种解决方案,具体代码如代码2.6。/* 获得纹理图ID*/private int initTexture(GL10 gl, Bitmap bitmap) int textures = new int1;gl.glGenTextures(1, textures, 0); / 获得未使用的纹理对象名称int currentTextureId = textures0;gl.glBindTexture(GL10.GL_TEXTURE_2D, currentTextureId);/创建和使用纹理对象gl.glTexParameterf(GL10.GL_TE

38、XTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);/ 指定放大缩小过滤方法gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPE

39、AT);GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);return currentTextureId;代码2.6第3章 开发模拟3D 主题样式3.1 说明与概述图3.1 模拟3D主题样式如图3.1是模拟3D主题样式,模拟3D主题样式实现的效果是通过取得前后两个子视图的图像,根据触摸点的x坐标,在屏幕上以固定的夹角、不同的视觉方向来绘制两幅图像,从而模拟真实世界的3D效果。因此,实现上述效果的主要难点在于:如何在同一屏幕中绘制这两幅图像。3.2 解决方案在绘制图像之前,必须获取图像,目前要获取的图像是Workspace每个子视图的Bit

40、map图像。首先,由于Workspace中每个子视图都有可能不同,而且随时可能发生变化(如:用户在子视图中增加了图标等),因此必须计算出要获取的是Workspace中的哪个子视图图像,然后获取特定子视图图像。代码3.1展示了如何通过Workspace获取其下特定的子视图图像。private void calculateRotate() 省略部分代码/* * 依据第一次手势移动的方向,判断转屏时需绘制的两个图像(View)即屏幕。 */if (!isGetPage) if (mdirection = DIR_RIGHT) page1 = (currentScreen + screenCount

41、- 1) % screenCount;page2 = currentScreen;if (mdirection = DIR_LEFT) page1 = currentScreen;page2 = (currentScreen + 1) % screenCount;isGetPage = true;/* 转屏期间,一次获得图像便可以 */if (!isGetBitmap) isGetBitmap = true;wallpaperDrawable = workspace.getmWallpaperManager().getFastDrawable();workspace.getChildAt(pa

42、ge1).setBackgroundDrawable(wallpaperDrawable);workspace.getChildAt(page2).setBackgroundDrawable(wallpaperDrawable);/* 获得workspace下的相应直接子View图像,即屏幕截图 */workspace.getChildAt(page1).buildDrawingCache();bitmaps0 = workspace.getChildAt(page1).getDrawingCache();workspace.getChildAt(page2).buildDrawingCach

43、e();bitmaps1 = workspace.getChildAt(page2).getDrawingCache();省略部分代码代码3.1然后,调用Workspace的invalidate()方法,触发其重绘屏幕。即触发其调用dispatchDraw(Canvas)方法 Workspace的dispatchDraw(Canvas)方法继承自ViewGroup,负责ViewGroup的重绘。当方法dispatchDraw(Canvas)检测到当前的触摸状态为SCROLLING时,就立即调用自定义方法startRotate(Canvas, float)。此方法定义了如何在屏幕上绘制固定的夹角

44、、不同的视觉方向的两幅图像。主要代码为代码3.2。/* * 转屏时,绘制模拟3d图形.绘制两个有一定角度的屏幕 */private void startRotate(Canvas canvas, float x) 省略部分代码doDraw(canvas, bitmaps0,new float 0, 0, width, 0, width, height, 0, height ,new float 0, height * (1 / 7.0f - value), x, 0, x, height, 0, height * (6 / 7.0f + value) );doDraw(canvas, bitm

45、aps1,new float 0, 0, width, 0, width, height, 0, height , new float x, 0, width, height * (1 / 64.0f + value), width,height * (63 / 64.0f - value), x, height ); 省略部分代码private void doDraw(Canvas canvas, Bitmap bp, float src, float dst) canvas.save();mMatrix.setPolyToPoly(src, 0, dst, 0, src.length 1)

46、;canvas.concat(mMatrix);canvas.drawBitmap(bp, 0, 0, null);canvas.restore();代码3.2其中,doDraw()方法包含了模拟3D效果的核心代码,它定义了如何利用矩阵来修改图像的大小、方向等。mMatrix是类中定义的矩阵对象,它能对多边形进行各种的变形。在上述代码中,mMatrix把图像看做一个矩形,源矩形四个点的二维坐标存储在src浮点型数组中,而目标矩形四个点的二维坐标存储在dst浮点型数组中,mMatrix依据源矩形和目标矩形的变化规则,在屏幕中源图像就被绘制成目标图像(即方向、大小等都改变后的图像)。3.3 优化方案由于模拟3D效果需要对图像进行处理,而cpu进行图像处理时耗时较多,占用资源也较多。因此,需要对此部分代码逻辑进行相应的优化。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号