两个基本的类让我们使用OpenGL ES API来创建和操纵图形:GLSurfaceView和 GLSurfaceView.Renderer。

1. GLSurfaceView:

这是一个视图类,你可以调用OpenGL API在上面绘制图形和操纵物体,功能和SurfaceView相似。我们可以创建一个GLSurfaceView类的实例,并添加自己的渲染器。如果我们要自己实现一些触摸屏的操作,我们必须扩展这个类来实现触摸监听器。

2. GLSurfaceView.Renderer

这个接口定义了在一个OpenGL的GLSurfaceView中绘制图形所需要的方法。我们必须在一个单独的类中为这些接口提供实现,并使用GLSurfaceView.setRenderer()方法将它依附到GLSurfaceView实例对象上。

我们需要实现GLSurfaceView.Renderer的以下方法:

a) onSurfaceCreated():系统在创建GLSurfaceView时调用它一次。我们可以使用它来设置OpenGL的环境变量,或是初始化OpenGL的图形物体。

b) onDrawFrame():系统在每次重绘GLSurfaceView时调用这个方法。这个方法主要完成绘制图形的操作。

c) onSurfaceChanged():系统在GLSurfaceView的几何属性发生改变时调用该方法,包括大小或是设备屏幕的方向发生变化。例如,系统在屏幕从直立变为水平使调用它。这个方法主要用来对GLSurfaceView容器的变化进行响应。

3.使用步骤

a.定义render

  1. public class SunnyGLRender implements GLSurfaceView.Renderer {
  2.  
  3. public float mAngle;
  4. float one = 0.5f;
  5. private FloatBuffer triggerBuffer2 = BufferUtil.floatToBuffer(new float []{
  6. 0,one,0, //上顶点
  7. -one,-one,0, //左下点
  8. one,-one,0,}); //右下点
  9. private FloatBuffer triggerBuffer1 = BufferUtil.floatToBuffer(new float []{
  10. 0,one,0, //上顶点
  11. -one,-one,0, //左下点
  12. one,-one,0,}); //右下点
  13. private float[] mTriangleArray = {
  14. // X, Y, Z 这是一个等边三角形
  15. -0.5f, -0.25f, 0,
  16. 0.5f, -0.25f, 0,
  17. 0.0f, 0.559016994f, 0 };
  18.  
  19. @Override
  20. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  21.  
  22. //GLES30:为OpenGL ES2.0版本,相应的
  23. //GLES30:OpenGL ES3.0
  24. //黑色背景
  25. gl.glClearColor(0.0f, 0f, 1f, 0.5f);
  26. //gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  27. // 启用顶点数组(否则glDrawArrays不起作用)
  28. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  29.  
  30. }
  31.  
  32. @Override
  33. public void onSurfaceChanged(GL10 gl, int width, int height) {
  34. //mProgram = GLES30.glCreateProgram();
  35. //Log.e("zcxgl", "Could not link program: mProgram = "+mProgram);
  36. Log.e("zcxgl","onSurfaceChanged");
  37. float ratio = (float) width / height;
  38. gl.glMatrixMode(GL10.GL_PROJECTION); // 设置当前矩阵为投影矩阵
  39. gl.glLoadIdentity(); // 重置矩阵为初始值
  40. //gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 根据长宽比设置投影矩阵
  41. gl.glFrustumf(-ratio, ratio, -1, 1, 5, 6);
  42.  
  43. }
  44. private FloatBuffer colorBuffer2 = BufferUtil.floatToBuffer(new float[]{
  45. one,0,0,one,
  46. 0,one,0,one,
  47. 0,0,one,one,
  48. });
  49. @Override
  50. public void onDrawFrame(GL10 gl) {
  51. // Redraw background color
  52. Log.d("zcxgl","onDrawFramew");
  53. gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  54. gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
  55.  
  56. /************ 启用MODELVIEW模式,并使用GLU.gluLookAt()来设置视点 ***************/
  57. // 设置当前矩阵为模型视图模式
  58. gl.glMatrixMode(GL10.GL_MODELVIEW);
  59. gl.glLoadIdentity(); // reset the matrix to its default state
  60. // 设置视点
  61. GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
  62. /*****************************************/
  63.  
  64. long time = SystemClock.uptimeMillis() % 4000L;
  65. mAngle = 0.090f * ((int)time);
  66. // 重置当前的模型观察矩阵
  67. gl.glLoadIdentity();
  68. // 移动绘图原点的坐标与上面的语句连用就相当于设置新的绘图远点坐标,
  69. //gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);//后面的1-10是指图像的1-10层,
  70. // 图像所处层次越大,在屏幕上显示就越小。默认为(0,0,1),
  71. // 左移 1.5 单位,并移入屏幕 6.0。
  72. gl.glTranslatef(0f, 0.0f, -5.0f);
  73.  
  74. gl.glRotatef(mAngle, 0.0f, 0.0f, 1.0f);
  75. //启用平滑着色
  76. gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//
  77. //gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);//可以直接设置绘图的单调颜色
  78. // 设置三角形点
  79. // gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
  80. gl.glVertexPointer(3,GL10.GL_FLOAT,0,triggerBuffer2);
  81. //设置平滑着色的颜色矩阵
  82. gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuffer2);//都是一维矩阵,因此第一个参数就是表示一个颜色的长度表示
  83. //绘制
  84. gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
  85. // 关闭颜色平滑着色设置
  86. gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
  87. //gl.glFinish();
  88.  
  89. }
  90. }

2.使用glsurfaceview 并设置render

  1. private GLSurfaceView mGLSurfaceView;
  2. static class BufferUtil {
  3. public static FloatBuffer mBuffer;
  4.  
  5. public static FloatBuffer floatToBuffer(float[] a) {
  6. // 先初始化buffer,数组的长度*4,因为一个float占4个字节
  7. ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
  8. // 数组排序用nativeOrder
  9. mbb.order(ByteOrder.nativeOrder());
  10. mBuffer = mbb.asFloatBuffer();
  11. mBuffer.put(a);
  12. mBuffer.position(0);
  13. return mBuffer;
  14. }
  15. }
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. initView();
  20. mGLSurfaceView.setRenderer(new SunnyGLRender());
  21. setContentView(mGLSurfaceView);
  22. }
  23.  
  24. @Override
  25. protected void onResume() {
  26. super.onResume();
  27. mGLSurfaceView.onResume();
  28. }
  29.  
  30. @Override
  31. protected void onPause() {
  32. super.onPause();
  33. mGLSurfaceView.onPause();
  34. }
  35.  
  36. private void initView() {
  37. mGLSurfaceView = new GLSurfaceView(this);
  38. }

3.效果

android-glsurfaceview Activity框架程序的更多相关文章

  1. Android之Activity框架

    在安卓应用中,经常需要Activity中经常需要有大量相似的Activity类,这些类往往有相似的结构与功能,因此产生了大量重复代码,为此,以下提供一种方法有效的降低了代码冗余. 定义Activity ...

  2. Android开源测试框架学习

    近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料. Android测试大致分三大块: 代码层测试 用户操作模拟,功能测试 安装部署及稳定性测试 代码层测试 对于一般java ...

  3. [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

    一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...

  4. Android课程---Activity的创建

    一.为了创建一个新的Activity,你需要继承Activity类,定义UI,实现功能.新的Activity的最基本的框架代码如下所示: package com.paad.myapplication; ...

  5. Android之activity初讲

    前天我们已经成功创建了第一个Android项目,如果我要把软件推荐给我的第一个用户,毫无疑问是从界面开始介绍.因为即使你的程序算法再高效,架构再出色,用户根本不会在乎这些,他们一开始只会对看到的东西感 ...

  6. Android aidl Binder框架浅析

      转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?B ...

  7. 详解Android首选项框架ListPreference

    详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...

  8. Android GLSurfaceView用法详解(二)

    输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...

  9. Android的MVC框架

    http://www.cnblogs.com/wanghafan/archive/2012/07/20/2600786.html MVC是当前比较流行的框架,随便Google下,就可以发现几乎所有的应 ...

随机推荐

  1. JavaWeb——JSTL 核心标签库使用

    JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...

  2. Twisted网络库编程实例

    于这一周看了python的第三方网络库Twisted,英文看的头比较大,想看英文的话点击这里.如果英文很烂,可以看中文,这里.总的来说我了解到的主要包括以下三个东东:Factory.protocol和 ...

  3. Hive表中的NULL值处理

    1 MySQL 到 Hive 表的sqoop任务把 原本的NULL 变成字符串 ‘null’ 了 alter table ${table_name} SET SERDEPROPERTIES('seri ...

  4. win7、centos7 双系统安装总结

    centos7安装过程 问题:TroubleShooting选项进入图形化界面安装才成功. win7恢复引导区 问题:安装完Centos后,win7的引导区不见了 具体恢复过程:http://www. ...

  5. leetcode139

    class Solution { public: bool wordBreak(string s, vector<string> wordDict) { vector<, false ...

  6. 直接添加viewController中的view时的注意事项

    直接添加viewController中的view时需要注意一个问题,比如: MyTestViewController *vc = [MyTestViewController new]; [self.v ...

  7. Spring.Net配置

    <?xml version="1.0" encoding="utf-8"?> <configuration>     <!--一定 ...

  8. layer.js 注册登录切换的问题

    layer.js 是一个很好用的弹窗框架,使用的时候很方便,但是今天遇到一个问题,让我很头疼啊,一直都做不出来,就是登录和注册弹窗的切换问题 这里涉及到两个页面:guide.html 即父页面,den ...

  9. 电商项目中使用Redis实现秒杀功能

    参与过抢购活动就知道,很明显的一点是商即便商品实际没有了也是可以下单成功的,但是在支付的时候会提示你商品没有了. 实现原理:list双向链表 使用redis队列,因为pop操作是原子的,即使有很多用户 ...

  10. 微信小程序页面跳转 的几种方式

    最近在做微信小程序,碰到页面跳转的问题,总结一下页面之间跳转的方式 一.wx.navigateTo(OBJECT) 这是最普遍的一种跳转方式,其官方解释为:“保留当前页面,跳转到应用内的某个页面” 类 ...