android开发教程04_2_OpenGL3D图形接口的使用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GLSurfaceViewActivity
TranslucentGLSurfaceViewActivity
Cube 实现的是一个使用 OpenGL 绘制的立方 体, CubeRenderer 表示基于立方体实现的渲染 器, GLSurfaceViewActivity 和 TranslucentGLSurfaceViewActivity 分别是图中左右两个效果 的界面。 透明的活动通过 android:theme 将背景颜色设置成了 Theme.Translucent ,表示透明的背景。
各个方法的参数 GL10 是 javax.microedition.khronos.opengles 包中的通用函数。 GLSurface View::Renderer 中的 onSurfaceChanged() 和 onSurfaceCreated() 方法实际上 是和 SurfaceView 中的两个方法对应的。实现的 GLSurfaceView::Renderer ,通过 GLSurfaceView 的 setRenderer() 方法将其设置到 GLSurfaceView 中。
GLSurfaceView::Renderer 是一个接口,其中主要定义了以 下几个方法:
abstract void onDrawFrame(GL10 gl) abstract void onSurfaceChanged(GL10 gl, int width, int height) abstract void onSurfaceCreated(GL10 gl, EGLConfig config)
在实现 3D 绘制的时候,一般需要同时实现 GLSurfaceView 和其中的 Renderer ,并且设置 Renderer 为 GLSurfaceView 当中的渲染器。渲 染器是真正实现绘制功能的地方。 GLSurfaceView 实际上是渲染器的一个容器 ,将其适配成 Android UI 系统上的控件,负责 事件处理方面。 GLSurfaceView 默认的格式为 PixelFormat.RGB_565 。
3D 图形接口的使用
韩 超 @ Android 经典应用
1 2 3 4
使用 OpenGL 图形接口的程序结构 单纯渲染器实现动画 具有用户交互的 3D 程序 实现背景透明
1 使用 OpenGL 图形接口的程序结构
在 Android 中,可以直接支持 3D 图形的 绘制,主要使用 OpenGL 标准的类 javax.microedition.khronos ,但是需要结合 Android GUI 系统使用。
用户应用
MyRenderer (实现Renderer) MYGLSurfaceView (扩展View)
GLSurfaceView::Renderer ::onDrawFrame() ห้องสมุดไป่ตู้:onSurfaceChanged() ::onSurfaceCreated ()
GLSurfaceView
OpenGL 接口调用
android.opengl包
SurfaceView
android.view.View
javax.microedition .khronos.opengles (OpenGL标准类库)
在使用 3D 的图形 API 方面,主要的步骤通常如下 所示: 1 .扩展 android.opengl.GLSurfaceView 类。 2 .实现 android.opengl.GLSurfaceView 中的 Renderer (渲染器)接口。 3 .将所实现的 GLSurfaceView.Renderer 接口设置成 GLSurfaceView 中的渲染器。
3 可交互的 3D
在具有用户交互的 3D 绘制程序中,则需要通过重 新实现 GLSurfaceView 来获得来自外部的事件。 setRenderMode() 必须在 setRenderer() 之后调用,其 中能使用的值有 2 个: RENDERMODE_CONTINUOUSLY :表示渲染器将会 被连续重复调用,来重新渲染。 RENDERMODE_WHEN_DIRTY :表示只有在调用 requestRender() 的时候,才会被重新渲染,因此可以 节省系统资源。
Touch Rotate ( Graphics=>OpenGL ES=>Touch Rotate ) 源代码: android/apis/graphics/TouchRotateActivity.java android/apis/graphics/Cube.java
public class TouchRotateActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLSurfaceView = new TouchSurfaceView(this); setContentView(mGLSurfaceView); mGLSurfaceView.requestFocus(); mGLSurfaceView.setFocusableInTouchMode(true); } @Override protected void onResume() { super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); mGLSurfaceView.onPause(); } private GLSurfaceView mGLSurfaceView; } class TouchSurfaceView extends GLSurfaceView { private class CubeRenderer implements GLSurfaceView.Renderer {} }
public void setRenderMode (int renderMode)
事件处理中的线程问题:
class MyGLSurfaceView extends GLSurfaceView { private MyRenderer mMyRenderer; public void start() { mMyRenderer = ...; setRenderer(mMyRenderer); } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { queueEvent(new Runnable() { public void run() { mMyRenderer.handleDpadCenter(); }}); return true; } return super.onKeyDown(keyCode, event); } }
2 单纯的渲染器实现动画
GLSurfaceView 的 setRenderer() 方法用于设置其中 的渲染器:
public void setRenderer (GLSurfaceView.Renderer renderer)
GLSurfaceView 的 onPause() 和 onRusume() 行为需 要和活动保持一致。
class CubeRenderer implements GLSurfaceView.Renderer { // 省略部分内容 public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glTranslatef(0, 0, -3.0f); gl.glRotatef(mAngle, 0, 1, 0); gl.glRotatef(mAngle*0.25f, 1, 0, 0); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); mCube.draw(gl); gl.glRotatef(mAngle*2.0f, 0, 1, 1); gl.glTranslatef(0.5f, 0.5f, 0.5f); mCube.draw(gl); mAngle += 1.2f; } // 省略部分内容 private boolean mTranslucentBackground; private Cube mCube; private float mAngle; }
示例程序: GLSurfaceViewActivity ( Graphics=>OpenGL ES=>GLSurfaceViewActivity ) TranslucentGLSurfaceViewActivity ( Graphics=>OpenGL ES=>TranslucentGLSurfaceViewActivity ) 源代码: src/com/example/android/apis/graphics/GLSurfaceViewActivity.java src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.java src/com/example/android/apis/graphics/CubeRenderer.java src/com/example/android/apis/graphics/Cube.java
4 实现透明的效果
在调用 OpenGL 接口的时候, GLSurfaceView 本身是 一个 GLSurfaceView 的继承者,,它又存在于活动中如果 需要使用透明的效果,需要对三者同时做出设置: 1 活动背景的透明 2 GLSurfaceView 的透明: SurfaceHolder 中的 setFormat() 3 OpenGL 绘制的透明: onSurfaceCreated()
public class TriangleActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLView = new GLSurfaceView(this); mGLView.setEGLConfigChooser(false); mGLView.setRenderer(new TriangleRenderer(this)); setContentView(mGLView); } @Override protected void onPause() { // 使其中的 View 停止 super.onPause(); mGLView.onPause(); } @Override protected void onResume() { // 使其中 View 重新开始 super.onResume(); mGLView.onResume(); } private GLSurfaceView mGLView; }
参考示例程序: Textured Triangle ( Graphics=>OpenGL ES=>Textured Triangle ) 源代码: src/com/example/android/apis/graphics/TriangleActivity.java src/com/example/android/apis/graphics/StaticTriangleRenderer.java