Android GLSurfaceView用法详解(二)
2016-05-03 13:57
393 查看
输入如何处理
若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件。下面有个例子:
java代码:
package eoe.ClearTest;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.MotionEvent;
public class ClearActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mGLView = new ClearGLSurfaceView(this);
setContentView(mGLView);
}
@Override
protected void onPause()
{
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume()
{
super.onResume();
mGLView.onResume();
}
private GLSurfaceView mGLView;
}
class ClearGLSurfaceView extends GLSurfaceView
{
public ClearGLSurfaceView(Context context)
{
super(context);
mRenderer = new ClearRenderer();
setRenderer(mRenderer);
}
public boolean onTouchEvent(final MotionEvent event)
{
queueEvent(new Runnable(){ public void run()
{ mRenderer.setColor(event.getX() / getWidth(), event.getY() / getHeight()1.0f); }}); return true; } ClearRenderer mRenderer; }
class ClearRenderer implements GLSurfaceView.Renderer
{
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{ // Do nothing special. }
public void onSurfaceChanged(GL10 gl, int w, int h)
{ gl.glViewport(0, 0, w, h); }
public void onDrawFrame(GL10 gl)
{ gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
public void setColor(float r, float g, float b)
{
mRed = r; mGreen = g; mBlue = b; }
private float mRed;
private float mGreen;
private float mBlue;
}
复制代码
这个应用在每一帧中清空屏幕。当 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代码:
public ClearGLSurfaceView(Context context)
{
super(context);
// Turn on error-checking and logging setDebugFlags(DEBUG_CHECK_GL_ERROR |DEBUG_LOG_GL_CALLS);
mRenderer = new ClearRenderer(); setRenderer(mRenderer);
复制代码
系列之Android GLSurfaceView用法详解(一)的帖子链接http://www.eoeandroid.com/thread-96857-1-1.html
若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件。下面有个例子:
java代码:
package eoe.ClearTest;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.MotionEvent;
public class ClearActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mGLView = new ClearGLSurfaceView(this);
setContentView(mGLView);
}
@Override
protected void onPause()
{
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume()
{
super.onResume();
mGLView.onResume();
}
private GLSurfaceView mGLView;
}
class ClearGLSurfaceView extends GLSurfaceView
{
public ClearGLSurfaceView(Context context)
{
super(context);
mRenderer = new ClearRenderer();
setRenderer(mRenderer);
}
public boolean onTouchEvent(final MotionEvent event)
{
queueEvent(new Runnable(){ public void run()
{ mRenderer.setColor(event.getX() / getWidth(), event.getY() / getHeight()1.0f); }}); return true; } ClearRenderer mRenderer; }
class ClearRenderer implements GLSurfaceView.Renderer
{
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{ // Do nothing special. }
public void onSurfaceChanged(GL10 gl, int w, int h)
{ gl.glViewport(0, 0, w, h); }
public void onDrawFrame(GL10 gl)
{ gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
public void setColor(float r, float g, float b)
{
mRed = r; mGreen = g; mBlue = b; }
private float mRed;
private float mGreen;
private float mBlue;
}
复制代码
这个应用在每一帧中清空屏幕。当 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代码:
public ClearGLSurfaceView(Context context)
{
super(context);
// Turn on error-checking and logging setDebugFlags(DEBUG_CHECK_GL_ERROR |DEBUG_LOG_GL_CALLS);
mRenderer = new ClearRenderer(); setRenderer(mRenderer);
复制代码
系列之Android GLSurfaceView用法详解(一)的帖子链接http://www.eoeandroid.com/thread-96857-1-1.html
相关文章推荐
- android ListView 添加 HeaderView 和 FooterView时 不可选择点击
- Android常用控件:ListView(2)
- android百度地图相关
- Android怎么得到某一服务是否在运行
- Android常用控件:ListView
- Android Binder通信机制学习
- PhoneGap(Cordova)通过自定义plugin插件实现javascript与android交互
- [笔记]Android 源码编译
- Android应用开发SharedPreferences存储数据的使用方法
- Android蓝牙实例(和单片机蓝牙模块通信)
- Android ADB命令大全(通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等)
- Android:方向传感器
- Android -线程池 批量上传图片 -附php接收代码
- Android jni GetFieldID 和 GetMethodID 函数的说明
- 基于mac,ndk开发,使用android studio 编译ffmpeg(二)
- 兔子-you are attempting to install the android sdk inside your android studio installation
- Android 开发最佳实践
- Android开发--Intent-filter属性详解
- Android Studio下的应用性能优化总结-内存优化
- Android Studio下默认使用release签名