Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置

简介: 原文地址:http://android.xsoftlab.net/training/graphics/opengl/index.html引言Android framework层为创建绚丽的功能性UI提供了大量的标准工具。

原文地址:http://android.xsoftlab.net/training/graphics/opengl/index.html

引言

Android framework层为创建绚丽的功能性UI提供了大量的标准工具。然而,如果想要以更多方式来控制屏幕的绘制,或者在三维图形中绘制,那么就需要使用其它工具了。Android framework所提供的OpenGL ES API为我们提供了一系列的工具,这些工具可以用来显示一些高端大气、天马行空的图形,只要你能想得到,那么它就可以做得到。此外,它还得益于很多设备所提供的GPU加速功能。

这节课会讨论OpenGL的开发基础:包括设置环境、绘制对象、移动绘制元素及响应触摸事件。

在接下来的示例代码中使用了OpenGL ES 2.0 API,该版本在当前的Android设备上推荐使用。有关更多OpenGL ES的版本信息,请参见OpenGL开发指南。

Note: 注意不要将OpenGL ES 1.x API与OpenGL ES 2.0 API相混淆!这两个版本的API之间不可交换使用,如果要使用的话,那么只有一个结果,就是悲剧。

构建OpenGL ES的相关环境

为了能在Android应用中使用OpenGL ES,必须给OpenGL ES要绘制的图形区域创建一个View容器。其中一种实现方法就是实现GLSurfaceViewGLSurfaceView.Renderer。其中GLSurfaceView是在OpenGL中绘制图形的View容器。GLSurfaceView.Renderer用于控制应该在刚才的View中绘制什么。有关更多这些类的信息,请参见OpenGL ES开发指南。

GLSurfaceView是将OpenGL ES整合到应用中的唯一途径。对于全屏或者接近全屏的图形View,GLSurfaceView是最合适的选择。开发者如果需要将OpenGL ES整合到一小块区域上,应该使用TextureView。除此之外还可以使用SurfaceView,不过这可能需要相当多的代码才能实现。

这节课将会展示以最省的代码来实现GLSurfaceView及GLSurfaceView.Renderer。

在清单文件中声明OpenGL ES的使用

为了可以使用OpenGL ES 2.0 API,需要在清单文件中添加如下声明:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

如果应用用到了纹理压缩的功能,那么还需要声明应用所使用到的压缩格式,这样的话,应用只能被安装在支持的设备上。

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

有关更多纹理压缩格式的相关信息,请参见OpenGL开发指南。

为OpenGL ES创建一个Activity

与普通的应用相同,OpenGL ES也同样需要用户界面。主要的不同在于普通的应用只需要将布局放入Activity就可以。在使用OpenGL ES的应用中,除了使用普通的TextView这类基本控件之外,还需要添加GLSurfaceView。

下面这段代码展示了使用GLSurfaceView的最基本实现:

public class OpenGLES20Activity extends Activity {
    private GLSurfaceView mGLView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
    }
}

Note: OpenGL ES 2.0需要在Android 2.2及以上的版本上才能运行,请确保应用程序的最低版本在此之上。

构建GLSurfaceView对象

GLSurfaceView是一块特殊的区域,它可以用户绘制OpenGL ES图形。它本身不需要做太多事情。实际上,图形的绘制是由GLSurfaceView.Renderer来控制的。事实上,你可能想要试着不去继承这个类,而是直接创建一个原生的GLSurfaceView实例,不要这么去做。你需要继承这个类来捕获触摸事件,相关信息在Responding to Touch Events课程中有涉及到。

本质上GLSurfaceView的代码是很少的,所以为了快速去实现它,常见的做法是在使用这个对象的Activity中创建一个内部类:

class MyGLSurfaceView extends GLSurfaceView {
    private final MyGLRenderer mRenderer;
    public MyGLSurfaceView(Context context){
        super(context);
        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2);
        mRenderer = new MyGLRenderer();
        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(mRenderer);
    }
}

对GLSurfaceView的其它附加选项就是设置其渲染模式:

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

这个选项阻止了GLSurfaceView框架的重新绘制,直到requestRender()方法被调用。这可以提高应用的效率。

构建渲染器类

GLSurfaceView.Renderer是真正有意思的地方。这个类可以控制在GLSurfaceView上所绘制的事物。它内部有3个方法,这3个方法由Android系统调用,用于计算如何在GLSurfaceView上进行绘制:

下面是OpenGL ES渲染器的最基本实现,这里只是在GLSurfaceView简单绘制了一个黑色的背景:

public class MyGLRenderer implements GLSurfaceView.Renderer {
    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }
    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }
    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

上面就是要做的所有工作了。上面的代码使用OpenGL绘制了一个黑色的背景。虽然这些代码并没有做什么有意思的事情,但是通过创建这些类,你就可以为通过OpenGL绘制图形打下了基础。

Note: 你可能会怀疑,在使用OpengGL ES 2.0 API时,为什么这些方法都会有个名叫GL10的参数。这些在2.0 API中重复使用到的签名方法是为了保持Android framework的代码简便。

如果你对OpenGL ES API很熟悉,你现在就可以设置OpenGL ES的环境并着手绘制图形了。无论如何,如果你想获取更多有关OpenGL的入门帮助,可以查看下节上部分的一些小提示。

目录
相关文章
|
4天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
65 19
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
70 14
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
146 3
|
1月前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
43 1
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。

热门文章

最新文章