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

java代码:

  1. package eoe.ClearTest;
  2. import javax.microedition.khronos.egl.EGLConfig;
  3. import javax.microedition.khronos.opengles.GL10;
  4. import android.app.Activity;
  5. import android.content.Context;
  6. import android.opengl.GLSurfaceView;
  7. import android.os.Bundle;
  8. import android.view.MotionEvent;
  9. public class ClearActivity extends Activity
  10. {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState)
  13. {
  14. super.onCreate(savedInstanceState);
  15. mGLView = new ClearGLSurfaceView(this);
  16. setContentView(mGLView);
  17. }
  18. @Override
  19. protected void onPause()
  20. {
  21. super.onPause();
  22. mGLView.onPause();
  23. }
  24. @Override
  25. protected void onResume()
  26. {
  27. super.onResume();
  28. mGLView.onResume();
  29. }
  30. private GLSurfaceView mGLView;
  31. }
  32. class ClearGLSurfaceView extends GLSurfaceView
  33. {
  34. public ClearGLSurfaceView(Context context)
  35. {
  36. super(context);
  37. mRenderer = new ClearRenderer();
  38. setRenderer(mRenderer);
  39. }
  40. public boolean onTouchEvent(final MotionEvent event)
  41. {
  42. queueEvent(new Runnable(){ public void run()
  43. { mRenderer.setColor(event.getX() / getWidth(), event.getY() / getHeight()1.0f); }}); return true; } ClearRenderer mRenderer; }
  44. class ClearRenderer implements GLSurfaceView.Renderer
  45. {
  46. public void onSurfaceCreated(GL10 gl, EGLConfig config)
  47. { // Do nothing special. }
  48. public void onSurfaceChanged(GL10 gl, int w, int h)
  49. { gl.glViewport(0, 0, w, h); }
  50. public void onDrawFrame(GL10 gl)
  51. { gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
  52. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  53. }
  54. public void setColor(float r, float g, float b)
  55. {
  56. mRed = r; mGreen = g; mBlue = b; }
  57. private float mRed;
  58. private float mGreen;
  59. private float mBlue;
  60. }

复制代码

这个应用在每一帧中清空屏幕。当 tap 屏幕时,改变屏幕的颜色。这里在 ClearGLSurfaceView.onTouchEvent() 中使用了 queueEvent()。queueEvent() 方法用于在 UI 线程和渲染线程间通信。也可以用起它的 Java 线程通信技术,如 synchronized 方法,但 queueEvent 最简单的线程通信方法。

其他的GLSurfaceView例子
        在Android SDK的API Demo例子程序中还有很多例子:
        GLSurfaceView
        Kube
        Translucent GLSurfaceView:透明背景
        Textured Triangle:纹理贴图
        Sprite Text:在 texture 上写文本并显示在 3D 场景中
        Touch Rotate:旋转 3D 对象

选择一个Surface

GLSurfaceView 提供了接口可选择 surface 的类型。默认情况下, GLSurfaceView 会使用一个 16 位 RGB frame buffer,带 16 位深度。你也可以根据自己的需要进行选择,比如在 Translucent GLSurfaceView 例子里,需要一个 Alpha 通道来实现透明。GLSurfaceView 提供了 setEGLSurfaceChooser()方法来选择 surface。
选择一个 RGB (565)的16位 framebuffer,接口如下:

setEGLConfigChooser(boolean needDepth)若要定制 red, green, blue, alpha 和 depth,则用如下接口:
       setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)使用自己实现的 EGLConfigChooser,用如下的接口:
       setEGLConfigChooser(EGLConfigChooser configChooser)持续型渲染模式 & 通知型渲染模式
       大多数 3D 应用,如游戏、模拟等都是持续型渲染的动画,还有些 3D 应用是反应式的(reactive),它们往往先被动等待,当用户有了动作再做出反应。对于这种应用,持续渲染屏幕是浪费时间。若开发反应式的应用,可以调用下面的方法
       GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);停止持续渲染。当调用
       GLSurfaceView.requestRender()时,程序再渲染屏幕。

 调试
       GLSurfaceView.setDebugFlags() 方法可以激活log或者错误检测,它们可以帮助调试 OpenGL ES 调用。具体使用时,在 GLSurfaceView 的构造函数中,调用 setRender() 之前调用 GLSurfaceView.setDebugFlags()就可以了。下面是个例子:

java代码:

  1. public ClearGLSurfaceView(Context context)
  2. {
  3. super(context);
  4. // Turn on error-checking and logging setDebugFlags(DEBUG_CHECK_GL_ERROR |DEBUG_LOG_GL_CALLS);
  5. mRenderer = new ClearRenderer(); setRenderer(mRenderer);

复制代码

系列之Android GLSurfaceView用法详解(一)的帖子链接http://www.eoeandroid.com/thread-96857-1-1.html

Android GLSurfaceView用法详解(二)的更多相关文章

  1. Android Fragment用法详解(2)--动态添加Fragment

    在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...

  2. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  3. Android.mk用法详解

    一.Android.mk介绍 Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握 ...

  4. Android Widget 开发详解(二) +支持listView滑动的widget

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...

  5. Android WebView 开发详解(二)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao   概览: Androi ...

  6. android: startActivityForResult用法详解

    一.如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode ...

  7. Android Fragment用法详解(1)--静态使用Fragment

    先说明一下,本例子是运行在Android Studio下面的.同样的代码复制粘贴到Eclipse运行却会报错.具体原因我也没有细查.知道的哥们,留言通知下呗. Fragment,也就是碎片,本意是为了 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(85)-Quartz 作业调度用法详解二

    前言 上一节我们学习了Quartz的基本用法 这一节学习通过XML配置的形式来执行任务 这一节主要认识一些属性,为下一步打基础 代码下载:链接:http://pan.baidu.com/s/1ge6j ...

  9. 全志Android SDK编译详解(二)

    注意要确定安装了jdk) 第一步: cd  lichee; ./build.sh  -p sun5i_elite -k 3.0  (apt-get install uboot-mkimage需要安装m ...

随机推荐

  1. Map中放置类指针并实现调用

    工作中使用到多进程通信,利用到了map以及multimap来进行实现. 需要做一个简单测试例子,直接上代码. /* * main.cpp * Created on: Oct 28, 2013 * Au ...

  2. IEEE 802.3 Ethernet

    Introduction Ethernet 是过去30年以来最为成功的局域网(local area networking)技术. 1. First widely used LAN technology ...

  3. Node 出现 uncaughtException 之后的优雅退出方案

    Node 的异步特性是它最大的魅力,但是在带来便利的同时也带来了不少麻烦和坑,错误捕获就是一个.由于 Node 的异步特性,导致我们无法使用 try/catch 来捕获回调函数中的异常,例如: try ...

  4. C# DES 加密 解密

    //注意:密钥必须为8位 private const string m_strEncryptKey = "abcd1234"; /// <summary> /// 加密 ...

  5. JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(<delimited-identifiers/>、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)

    一.自定义映射的表名 1. @Entity @Table(name = "USERS") public class User implements Serializable { / ...

  6. C#与USB HID间的通信

    原文:C#与USB HID间的通信 C#与USBHID接口的通讯相对于与串口间的通讯较为复杂,其中需要多次调用到Windows的一些API.其原理编者尚未全部理清,以下提供简单的USBHID通讯流程. ...

  7. Merry Christmas 2015

    祝大家圣诞快乐! 昨天下班在电梯里遇见HR大BOSS,她说公司今天上午有2200个员工要带小孩子来参加Children's Holidy Party...我问了句,那是不是有免费早餐和午餐啊,她说 & ...

  8. Java:抽象类abstract和接口Interface

    一.抽象类:abstract 抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情.对于一个父类,如果它的某个方法在父类中实现出来 ...

  9. C语言:指针的几种形式二

    一.const指针 1.const int* p和int const* p:两者意义是相同的.指向的内容是只读数据,不可以q改变:但是指向的地址可以改变. 2.int* const p:必须先对指针初 ...

  10. Android 软键盘弹出时把布局顶上去,控件乱套解决方法

    解决办法:方法一:在你的activity中的oncreate中setContentView之前写上这个代码getWindow().setSoftInputMode(WindowManager.Layo ...