《Android 应用案例开发大全(第二版)》——2.5节辅助绘制类

简介:

本节书摘来自异步社区《Android 应用案例开发大全(第二版)》一书中的第2章,第2.5节辅助绘制类,作者 吴亚峰 , 于复兴 , 杜化美,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.5 辅助绘制类
Android 应用案例开发大全(第二版)
上一节介绍了壁纸实现的开发,本节将开始对辅助绘制类的开发进行详细介绍。在绘制3D水族馆动态壁纸中的各个物体之前,必须要做好准备工作,而这些准备工作就包括辅助绘制类的开发。辅助绘制类包括背景图辅助绘制类BackGround,气泡辅助绘制类Bubble和模型辅助绘制类LoadedObjectVertexNormalTexture,下面就对这些类的开发进行详细介绍。

2.5.1 背景图辅助绘制类——BackGround
本小节将对本案例的背景图辅助绘制类进行详细介绍,这个类的作用是绘制水族馆的馆体,所有的鱼、水草和石头都包含在水族馆的馆体内。具体代码如下所示。

1 package com.bn.ld.draw;
2 ……//此处省略部分类和包的引入代码,读者可自行查阅光盘中的源代码
3 public class BackGround {
4  private FloatBuffer   mVertexBuffer;    // 顶点坐标数据缓冲
5  private FloatBuffer   mTextureBuffer;   // 顶点纹理数据缓冲
6  int vCount;
7  public BackGround() {
8  vCount=12;         // 顶点的数量
9   float vertices[]=new float[] {     // 顶点坐标数据数组
10 -23*Constant.SCREEN_SCALEX,20*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
11 -23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
12 23*Constant.SCREEN_SCALEX,20*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
13 -23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
14 23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
15 23*Constant.SCREEN_SCALEX,20*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
16 -23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
17 -23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,30*Constant.SCREEN_SCALEZ,
18 23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ,
19 -23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,30*Constant.SCREEN_SCALEZ,
20 23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,30*Constant.SCREEN_SCALEZ,
21 23*Constant.SCREEN_SCALEX,-10*Constant.SCREEN_SCALEY,-30*Constant.SCREEN_SCALEZ, 
22  };
23  ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);               // 创建顶点坐标数据缓冲
24  vbb.order(ByteOrder.nativeOrder());    // 设置字节顺序
25  mVertexBuffer = vbb.asFloatBuffer();    // 转换为int型缓冲
26  mVertexBuffer.put(vertices);     // 向缓冲区中放入顶点坐标数据
27  mVertexBuffer.position(0);      // 设置缓冲区起始位置
28  float textureCoors[]=new float[]{    // 顶点纹理S、T坐标值数组
29    0,0,0,0.85f,1,0,
30    0,0.85f,1,0.85f,1,0,
31    0,0.9f,0,1,1,0.9f,
32    0,1,1,1,1,0.9f
33   }; 
34  ByteBuffer cbb = ByteBuffer.allocateDirect(textureCoors.length*4);              // 创建顶点纹理数据缓冲
35  cbb.order(ByteOrder.nativeOrder());    // 设置字节顺序
36  mTextureBuffer = cbb.asFloatBuffer();   // 转换为int型缓冲
37  mTextureBuffer.put(textureCoors);    // 向缓冲区中放入顶点纹理数据
38  mTextureBuffer.position(0);     // 设置缓冲区起始位置
39  }
40  public void drawSelf(GL10 gl,int texld){
41   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);// 允许使用顶点数组
42   gl.glVertexPointer(      // 为画笔指定顶点坐标数据
43    3,        // 每个顶点的坐标数量为3
44    GL10.GL_FLOAT,      // 顶点坐标的类型GL_FIXED
45    0,            // 连续顶点坐标数据之间的间隔
46    mVertexBuffer );      // 顶点坐标数据
47   gl.glEnable(GL10.GL_TEXTURE_2D);    // 开启纹理
48   gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 允许使用纹理数组
49   gl.glTexCoordPointer(    // 为画笔指定纹理u、v坐标数据
50    2,        // 每个顶点两个纹理坐标数据 S、T
51    GL10.GL_FLOAT,      // 数据类型
52    0,        // 连续纹理坐标数据之间的间隔
53    mTextureBuffer );     // 纹理坐标数据
54   gl.glBindTexture(GL10.GL_TEXTURE_2D, texld); // 为画笔绑定指定名称ID纹理
55   gl.glDrawArrays(       // 绘制图形
56   GL10.GL_TRIANGLES,      // 以三角形的方式绘制
57   0,           // 开始点编号
58   vCount           // 顶点坐标的个数
59  );}}

第4~22行为创建顶点坐标缓冲和顶点纹理坐标缓冲,设置背景图片的顶点坐标。
第23~39行为初始化顶点坐标缓冲和顶点纹理数据缓冲并且设置了字节顺序,同时将数据放入了缓冲区,设置缓冲区的起始位置。
第40~59行为设置允许使用顶点数组,为画笔指定顶点坐标数据,开启纹理,允许使用纹理数组,为画笔绑定纹理,并且以三角形的方式绘制图形。

2.5.2 气泡辅助绘制类——Bubble
本小节将对案例中的气泡辅助绘制类进行详细介绍,在本案例的运行界面中,屏幕前面不断从下方冒出透明的气泡,这些气泡有大有小而且位置各不相同,上升的最大高度也不同,要绘制出这些气泡,就必须对气泡辅助绘制类进行很好地设计,具体代码如下所示。

1 package com.bn.ld.draw;
2 ……//此处省略部分类和包的引入代码,读者可自行查阅光盘中的源代码
3 public class Bubble {
4  private FloatBuffer   mVertexBuffer;    // 顶点坐标数据缓冲
5  private FloatBuffer   mTextureBuffer;   // 顶点纹理数据缓
6  int vCount=0;        // 顶点数量
7  public Bubble() {
8   float UNIT_SIZE=1.0f;
9   vCount=6;        // 顶点的数量 
10  float vertices[]=new float[]{ //顶点坐标数据数组
11   -0.15f*UNIT_SIZE,0.15f*UNIT_SIZE,0,
12   -0.15f*UNIT_SIZE,-0.15f*UNIT_SIZE,0,
13   0.15f*UNIT_SIZE,0.15f*UNIT_SIZE,0,
14   -0.15f*UNIT_SIZE,-0.15f*UNIT_SIZE,0,
15   0.15f*UNIT_SIZE,-0.15f*UNIT_SIZE,0,
16   0.15f*UNIT_SIZE,0.15f*UNIT_SIZE,0,
17  };
18  ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);               // 创建顶点坐标数据缓冲
19  vbb.order(ByteOrder.nativeOrder());    // 设置字节顺序
20  mVertexBuffer = vbb.asFloatBuffer();    // 转换为int型缓冲
21  mVertexBuffer.put(vertices);     // 向缓冲区中放入顶点坐标数据
22  mVertexBuffer.position(0);      // 设置缓冲区起始位置
23  float textureCoors[]=new float[]{     // 顶点纹理S、T坐标值数组
24   0,0,0,1,1,0,
25   0,1,1,1,1,0
26  }; 
27  ByteBuffer cbb = ByteBuffer.allocateDirect(textureCoors.length*4);               // 创建顶点纹理数据缓冲
28  cbb.order(ByteOrder.nativeOrder());    // 设置字节顺序
29  mTextureBuffer = cbb.asFloatBuffer();   // 转换为int型缓冲
30  mTextureBuffer.put(textureCoors);    // 向缓冲区中放入顶点着色数据
31  mTextureBuffer.position(0);     // 设置缓冲区起始位置
32  }
33  public void drawSelf(GL10 gl,int texld){
34         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 允许使用顶点数组
35         gl.glVertexPointer (      // 为画笔指定顶点坐标数据
36           3,       // 每个顶点的坐标数量为3 
37           GL10.GL_FLOAT,     // 顶点坐标值的类型为GL_FIXED
38           0,        // 连续顶点坐标数据之间的间隔
39           mVertexBuffer     // 顶点坐标数据
40         );
41         gl.glEnable(GL10.GL_TEXTURE_2D);      // 开启纹理
42         gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 允许使用纹理数组
43         gl.glTexCoordPointer (      // 为画笔指定纹理u、v坐标数据
44           2,        // 每个顶点两个纹理坐标数据 S、T
45           GL10.GL_FLOAT,      // 数据类型
46           0,        // 连续纹理坐标数据之间的间隔
47           mTextureBuffer  );    // 纹理坐标数据
48         gl.glBindTexture(GL10.GL_TEXTURE_2D, texld);   // 为画笔绑定指定名称ID纹理
49         gl.glDrawArrays (       // 绘制图形
50           GL10.GL_TRIANGLES,     // 三角形方式填充
51           0,         // 开始点编号
52           vCount       // 顶点坐标的个数
53         ); }}

第4~17行定义了顶点坐标缓冲和顶点纹理坐标缓冲,设置气泡的顶点坐标。
第18~32行为初始化顶点坐标缓冲和顶点纹理数据缓冲并且设置了字节顺序,同时将数据放入缓冲区,设置缓冲区的起始位置为0。
第33~53行为设置允许使用顶点数组,为画笔指定顶点坐标数据、开启纹理、允许使用纹理数组、为画笔绑定纹理,并且以三角形的方式进行绘制。

2.5.3 3D模型辅助绘制类——LoadedObjectVertexNormalTexture
因为水族馆中必不可少的是鱼,所以要向壁纸中加入鱼元素。本案例中的鱼为3D模型,下面就对加载3D模型并进行3D模型相关处理的辅助绘制类进行详细介绍,具体代码如下所示。

1 package com.bn.ld.draw;
2 ……//此处省略部分类和包的引入代码,读者可自行查阅光盘中的源代码
3 public class LoadedObjectVertexNormalTexture{
4  private FloatBuffer   mVertexBuffer;    // 顶点坐标数据缓冲
5  private FloatBuffer   mTexBuffer;    // 顶点纹理数据缓冲
6  int vCount=0;          // 顶点数量
7 public LoadedObjectVertexNormalTexture(float[] vertices,float[] normals,float   
 texCoors[]) {
8  vCount=vertices.length/3;         // 计算顶点个数
9  ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);               // 创建顶点坐标数据缓冲
10  vbb.order(ByteOrder.nativeOrder());    // 设置字节顺序
11  mVertexBuffer = vbb.asFloatBuffer();    // 转换为float型缓冲
12  mVertexBuffer.put(vertices);     // 向缓冲区中放入顶点坐标数据
13  mVertexBuffer.position(0);      // 设置缓冲区起始位置
14  ByteBuffer vbt = ByteBuffer.allocateDirect(texCoors.length*4);               // 创建纹理坐标数据缓冲
15  vbt.order(ByteOrder.nativeOrder());    // 设置字节顺序
16  mTexBuffer = vbt.asFloatBuffer();    // 转换为float型缓冲
17  mTexBuffer.put(texCoors);      // 向缓冲区中放入顶点坐标数据
18  mTexBuffer.position(0);      // 设置缓冲区起始位置
19 }
20 public void drawSelf(GL10 gl,int texId) { 
21  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 启用顶点坐标数组 
22  gl.glEnable(GL10.GL_TEXTURE_2D);        // 开启纹理 
23  gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 允许使用纹理S、T坐标缓冲
24  gl.glVertexPointer(       // 为画笔指定顶点坐标数据
25   3,         // 每个顶点的坐标数量为3
26   GL10.GL_FLOAT,      // 顶点坐标值的类型为 GL_FIXED
27   0,          // 连续顶点坐标数据之间的间隔
28   mVertexBuffer);       // 顶点坐标数据
29  gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer);                 // 为画笔指定纹理S、T坐标缓冲
30  gl.glBindTexture(GL10.GL_TEXTURE_2D, texId); // 绑定当前纹理
31  gl.glDrawArrays  (       // 绘制图形
32   GL10.GL_TRIANGLES,       // 以三角形方式填充
33   0,           // 开始点编号
34   vCount );        // 顶点的数量
35  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); // 禁用顶点坐标数组
36  gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 禁用纹理S、T坐标缓冲
37  gl.glDisable(GL10.GL_TEXTURE_2D);    // 禁用纹理
38 }}

第4~19行创建了顶点坐标缓冲和顶点纹理坐标缓冲,并且初始化顶点坐标缓冲和顶点纹理数据缓冲、设置了字节顺序、将数据放入了缓冲区,设置缓冲区起始位置为0。
第20~38行允许使用顶点数组、为画笔指定顶点坐标数据、开启纹理、允许使用纹理数组、为画笔绑定纹理,并以三角形的方式填充。

相关文章
|
1天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。
|
1天前
|
缓存 安全 Android开发
构建高效Android应用:采用Kotlin进行内存优化
【5月更文挑战第1天】随着移动设备的普及,用户对应用程序的性能要求越来越高。特别是对于Android开发者来说,理解并优化应用的内存使用是提升性能的关键。本文将探讨使用Kotlin语言在Android开发中实现内存优化的策略和技术。我们将深入分析Kotlin特有的语言特性和工具,以及它们如何帮助开发者减少内存消耗,避免常见的内存泄漏问题,并提高整体应用性能。
|
1天前
|
安全 Android开发 开发者
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【4月更文挑战第30天】 在移动开发领域,随着技术的不断进步,为了提高应用的性能和用户体验,开发者们不断地探索新的工具和框架。对于Android平台而言,Kotlin语言以其简洁性和功能性成为了开发的首选。而Jetpack组件则提供了一套高质量的库、工具和指南,帮助开发者更轻松地构建高质量的应用程序。本文将探讨如何结合Kotlin语言和Jetpack组件来优化Android应用的开发流程,提升应用性能,并保证代码的可维护性和可扩展性。
|
1天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第30天】在Android开发领域,Kotlin作为一种现代化的编程语言,因其简洁性和功能性受到了开发者的广泛欢迎。尽管与传统的Java相比,Kotlin提供了诸多便利,但关于其性能表现的讨论始终未息。本文将深入分析Kotlin和Java在Android平台上的性能差异,通过实际测试数据揭示两种语言在编译效率、运行速度以及内存占用方面的具体表现,并探讨如何利用Kotlin的优势来提升Android应用的整体性能。
|
2天前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第30天】 在移动开发领域,性能优化与流畅的用户体验始终是开发者追求的目标。随着Kotlin语言在Android开发中的普及,其提供的协程特性成为了解决异步编程问题的有力工具。本文将通过深入分析Kotlin协程的原理与实践,展示如何在Android应用中利用协程提升响应速度和处理效率,同时保证代码的简洁性和可维护性。我们将从基本概念出发,逐步深入到协程的高级使用场景,帮助开发者构建更加高效的Android应用。
|
2天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第30天】在移动开发领域,随着用户需求的不断增长和设备性能的持续提升,实现流畅且高效的用户体验已成为开发者的首要任务。针对Android平台,Kotlin协程作为一种新兴的异步编程解决方案,以其轻量级线程管理和简洁的代码逻辑受到广泛关注。本文将深入探讨Kotlin协程的概念、优势以及在实际Android应用中的运用,通过实例演示如何利用协程提升应用性能和响应能力,为开发者提供一条构建更高效Android应用的实践路径。
|
2天前
|
存储 Java Android开发
安卓应用开发中的内存优化策略
【4月更文挑战第30天】在移动开发领域,尤其是安卓平台上,内存管理是影响应用性能和用户体验的关键因素。由于安卓设备的硬件资源有限,不合理的内存使用会导致应用响应缓慢、消耗过多电量甚至崩溃。本文将探讨针对安卓平台的内存优化技巧,旨在帮助开发者提高应用的性能和稳定性,从而提升用户满意度。我们将详细讨论内存泄漏的预防、合理的内存分配策略以及高效的内存回收方法。
|
2天前
|
安全 网络安全 Android开发
云端防御策略:融合云服务与网络安全的未来构建高效的Android应用:从内存优化到电池寿命
【4月更文挑战第30天】 随着企业加速向云计算环境转移,数据和服务的云端托管成为常态。本文探讨了在动态且复杂的云服务场景下,如何构建和实施有效的网络安全措施来保障信息资产的安全。我们将分析云计算中存在的安全挑战,并展示通过多层次、多维度的安全框架来提升整体防护能力的方法。重点关注包括数据加密、身份认证、访问控制以及威胁检测与响应等关键技术的实践应用,旨在为读者提供一种结合最新技术进展的网络安全策略视角。 【4月更文挑战第30天】 在竞争激烈的移动市场中,Android应用的性能和资源管理已成为区分优秀与平庸的关键因素。本文深入探讨了提升Android应用效率的多个方面,包括内存优化策略、电池
|
2天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
2天前
|
机器学习/深度学习 人工智能 缓存
安卓应用性能优化实践探索深度学习在图像识别中的应用进展
【4月更文挑战第30天】随着智能手机的普及,移动应用已成为用户日常生活的重要组成部分。对于安卓开发者而言,确保应用流畅、高效地运行在多样化的硬件上是一大挑战。本文将探讨针对安卓平台进行应用性能优化的策略和技巧,包括内存管理、多线程处理、UI渲染效率提升以及电池使用优化,旨在帮助开发者构建更加健壮、响应迅速的安卓应用。 【4月更文挑战第30天】 随着人工智能技术的迅猛发展,深度学习已成为推动计算机视觉领域革新的核心动力。本篇文章将深入分析深度学习技术在图像识别任务中的最新应用进展,并探讨其面临的挑战与未来发展趋势。通过梳理卷积神经网络(CNN)的优化策略、转移学习的实践应用以及增强学习与生成对