《Android 应用案例开发大全(第3版)》——第2.3节壁纸的基本框架

简介:

本节书摘来自异步社区《Android 应用案例开发大全(第3版)》一书中的第2章,第2.3节壁纸的基本框架,作者 吴亚峰 , 苏亚光 , 于复兴,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 壁纸的基本框架
对百纳水族馆案例中每个类进行详细介绍之前,首先对本案例的基本框架进行简单的介绍。本节将要介绍的是本案例的基本框架、案例中各个类的作用以及类与类之间的关系,从而使读者对百纳水族馆有一个全面的了解,可以更好地理解本案例的详细开发过程。

2.3.1 壁纸项目的框架结构
下面将对百纳水族馆动态壁纸的整体框架进行简单介绍,使读者结合壁纸项目的框架结构图对本案例的开发过程有一个全面清晰的认识,对动态壁纸的制作流程有一个初步了解。本项目主要包含5大类,其框架如图2-17所示。


3edfdccc1539aef537b2d79155ef13e7deaa34fe

说明
图2-17是本案例的框架图,从中可以看出,本项目主要包含壁纸实现类、绘制类、线程类、工具常量类以及辅助绘制类等。这里简单了解一下即可,后面将进一步进行较为详细的介绍。

2.3.2 各个类的简要介绍
前面介绍了5大类的基本框架,为了使读者更为详细地了解各个类的作用以及各个类之间的联系,下面将对本项目中的所有类一一进行简要介绍,使读者对3D动态壁纸——百纳水族馆的制作流程有一个深刻的认识,具体内容如下。

1.壁纸实现类
壁纸服务类OpenGLES2WallpaperService。
GLWallpaperService类是动态壁纸类的基础类,此类为壁纸项目的开发提供了服务接口,OpenGLES2WallpaperService是百纳水族馆的基础类,通过继承GLWallpaperService类,重写onCreateEngine方法等来实现壁纸功能。

自定义场景渲染器类MySurfaceView。
MySurfaceView是百纳水族馆的核心类,在本类中首先设置使用OPENGL ES2.0渲染技术,然后创建了本案例中需要绘制的所有对象,设置各个对象的绘制方式,加载各类物体模型及所需纹理,设置摄像机位置,使用投影矩阵,初始化光源位置等。

2.绘制类
群鱼控制类FishControl。
FishControl类是群鱼控制类(群鱼是指不包括鱼群的所有单条鱼、乌龟的集合)。在该类中定义了群鱼列表,列表中存放着所有的单条鱼对象和乌龟对象,创建并启动鱼的移动线程,最后遍历群鱼列表对单条鱼、乌龟进行绘制。

单条鱼类SingleFish。
SingleFish类绘制单条鱼类(包括乌龟)。在此类中定义了单条鱼的所有属性,包括鱼的位置、速度、外力、鱼食对鱼的吸引力、鱼的质量(力的缩放比)、鱼的旋转角度等。该类中的fishMove方法计算了鱼的旋转角度、鱼所受的外力和鱼食对鱼的吸引力。

鱼群控制类FishSchoolControl。
FishSchoolControl类是鱼群的控制类。在此类中定义了鱼群中的每条鱼,这些鱼组成了可以一起游动的鱼群,鱼群中的第一条鱼不受到其他任何鱼的外力,只受到墙壁的作用力;然后创建并启动鱼群的游动线程,遍历鱼群列表实现对鱼群的绘制。

单个鱼群类SingleFishSchool。
SingleFishSchool类是绘制鱼群里单条鱼的类。此类中定义了鱼群中每条鱼的所有相关属性,具体包括鱼的位置、速度、外力、鱼偏离相对位置(以鱼群中第一条鱼所在位置为球心,以定长半径确定球面上的一个点)后受到的向心力、鱼的质量、鱼的旋转角度等。

喂食类FeedFish。
FeedFish类是食物的控制类。此类中startFeed方法的作用是由摄像机与触控点确定一条与场景地面高度交叉的拾取射线并计算出交点的坐标,如果是第一次调用此方法,此方法还会调用SingleFood的startFeed方法来启动SingleFood中创建的两个线程。

鱼食类SingleFood。
SingleFood类是绘制鱼食的类。该类的作用是创建并启动线程,绘制鱼食。在此类中定义了食物的移动线程,计算鱼食对鱼的吸引力线程,给出了食物的Y坐标,并创建了启动以上两个线程的startFeed方法,最后再进行鱼食的绘制。

气泡控制类BubbleControl。
BubbleControl类是本案例中所有气泡的控制类。在本类中首先根据气泡的数量创建气泡对象并将气泡对象添加到气泡列表中,然后创建并启动气泡移动线程,根据气泡的位置对气泡进行排序,最后遍历气泡列表并且绘制气泡。

单个气泡类SingleBubble。
SingleBubble类用于绘制场景中的单个气泡类,在本类中定义了气泡的所有属性,如气泡的位置、纹理ID、最大高度等。每调用一次此类中的bubbleMove方法,气泡就会移动一小段距离,如果气泡的Y坐标位置大于气泡高度的最大值,就会调用newPosition方法重新设置气泡的位置和气泡的最大高度。

3.线程类
群鱼游动线程类FishGoThread。
FishGoThread类是群鱼游动的线程类。在此类中遍历群鱼列表判断两条鱼之间的距离,若距离小于阈值,则两条鱼之间产生力的作用。对鱼进行碰撞检测,当鱼与墙壁的距离小于阈值时鱼会受到与墙壁垂直的力,然后修改鱼所受到的外力、鱼的速度和位置。

鱼群游动线程类FishschoolThread。
FishschoolThread类是鱼群游动的线程类。在此类中遍历鱼群列表并判断鱼群中的鱼(不包括第一条鱼)与相对位置的距离,若距离大于阈值就会对该鱼产生向心力;然后对鱼群进行碰撞检测,碰壁时鱼群受到一个与墙壁垂直的力;最后修改鱼所受到的外力、鱼群的速度和位置。

鱼食对鱼产生吸引力的线程类AttractThread。
AttractThread类是鱼食对鱼产生吸引力的线程类。在此类中不断遍历群鱼列表判断鱼是否能看到鱼食,如果鱼能看到鱼食,则该鱼受到鱼食的吸引力作用使鱼向鱼食游动,当鱼与鱼食之间的距离小于阈值后鱼食消失,认定鱼食已经被吃掉。本案例中鱼食对鱼群中的鱼不产生吸引力作用。

鱼食移动线程类FoodThread。
FoodThread类是鱼食移动的线程类。在此类中只要喂食线程中的标志位没有被置成false就会不断地修改鱼食的X方向和Z方向的位置使鱼食产生晃动的效果,然后不断地修改鱼食的Y位置。

气泡移动线程类BubbleThread。
BubbleThread类是气泡的移动线程。在此类中首先遍历气泡列表,将气泡分为3份(因为在本案例中有3处气泡,读者可根据自身需要进行更改),进行标志用来判断气泡向左还是向右上升;然后调用气泡对象中的bubbleMove方法,从而实现气泡的移动。

4.工具常量类
常量类Constant。
Constant类是整个壁纸中用到的所有静态常量的集合。其中包括屏幕的长宽比、摄像机的位置、背景图的缩放比、地面高度等一系列静态常量。将这些常用的静态常量定义到常量类Constant中,会降低程序的维护成本,同时会增强程序的可读性。

向量类Vector。
Vector类是本案例中用到的三维向量的类。包含了案例中所有需要的向量算法,具体包括求向量的模、向量的减法、向量的加法、向量的归一化等。此外还有获取力的大小,求指定半径的向量,获取从一个向量指向另一个向量的向量等方法。

屏幕拾取类IntersectantUtil。
IntersectantUtil类是和屏幕拾取相关的工具类(主要是在对鱼进行喂食的时候会用到该类中包含的相关算法),通过拾取计算获得触控点在摄像机坐标系中的坐标,再乘以摄像机矩阵的逆矩阵即可得到该点在世界坐标系中的坐标。

着色器加载类ShaderUtil。
ShaderUtil类是着色器加载的工具类。该类的作用是将着色器(shader)的脚本加载进显卡并且编译,其中loadFromAssetsFile方法用来从着色器sh脚本中加载着色器的内容,checkGIError方法用来检查每一步操作是否有错误,createProgram方法用来创建着色器程序,loadShader方法用来加载着色器编码进GPU并且进行编译。

存储矩阵状态类MatrixState。
MatrixState类是用于封装Matrix类各项功能的类。MatrixState是一个非常重要的类,其中包括摄像机矩阵、投影矩阵、当前物体总变换矩阵等。它还包括获取当前矩阵逆矩阵的方法,获取摄像机矩阵,获取保护矩阵以及恢复矩阵的方法。

5.辅助绘制类
背景图辅助绘制类Background。
Background类是百纳水族馆背景及地板的辅助绘制类。其中地板是虚拟的,在程序中只是给出了地面高度用来喂鱼。该类中给出了背景图的顶点坐标以及纹理坐标,并形成顶点缓冲和纹理缓冲送进渲染管线,用来绘制背景图。

气泡辅助绘制类Bubble。
Bubble类是百纳水族馆中气泡的辅助绘制类。该类主要是构造一个纹理矩形并贴上气泡纹理,开启混合之后,用户就可以看到气泡了。此类中给出了纹理矩形的顶点坐标以及纹理坐标,并形成顶点缓冲和纹理缓冲送进渲染管线,从而用于气泡的绘制。

模型辅助绘制类LoadedObjectVertexNormalTexture。
LoadedObjectVertexNormalTexture类是百纳水族馆中鱼食的辅助绘制类。该类的主要作用是对加载的obj模型信息进行处理,形成顶点缓冲、纹理缓冲以及法向量缓冲,并将相关的缓冲送入渲染管线,用于对于鱼食的绘制。

模型辅助绘制类MS3DModel。
MS3DModel类是百纳水族馆中鱼类、乌龟以及珍珠贝的辅助绘制类。该类的主要作用是加载ms3d骨骼动画模型并对加载完的模型信息进行处理,形成顶点缓冲、纹理缓冲、法向量缓冲等,并将相关缓冲送入渲染管线,用于百纳水族馆中鱼类、乌龟以及珍珠贝的绘制。

相关文章
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
23 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
5 0
Android系统 应用存储路径与权限
|
6天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
3 0
|
6天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
8 0
|
8天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
10天前
|
搜索推荐 开发工具 Android开发
安卓即时应用(Instant Apps)开发指南
【4月更文挑战第14天】Android Instant Apps让用户体验部分应用功能而无需完整下载。开发者需将应用拆分成模块,基于已上线的基础应用构建。使用Android Studio的Instant Apps Feature Library定义模块特性,优化代码与资源以减小模块大小,同步管理即时应用和基础应用的版本。经过测试,可发布至Google Play Console,提升用户便利性,创造新获客机会。
|
10天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
10天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
16天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
16天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。