GLSurfaceView 是一個視圖,繼承至SurfaceView,它內嵌的surface專門負責OpenGL渲染。
在使用的時候要實現以下幾步。
一、創建自定義1類繼承自GLSurfaceView,並創建構造器
二、創建自定義2類實現GLSurfaceView.Renderer接口
重寫onDrawFrame(GL10 gl)、 onSurfaceChanged(GL10 gl, int width, int height)、onSurfaceCreated(GL10 gl, EGLConfig config)方法
三、在自定義1中定義自定義類2,並在自定義類1的構造方法中調用setRenderer(renderer);方法進行渲染器設置
四、在主Ativity中創建自定義類1,並將其設置為視圖,為了使GLSurfaceView能夠與Activity同步,要重寫Activity的onPouse和onResume方法,並分別在相應的方法中調用GLSurfaceView的onPouse和onResume方法。
*********以下一簡單的GLSurfaceView應用,點擊屏幕,根據屏幕坐標設置屏幕顏色。*******
package com.example.android_opengl;
import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL; import javax.microedition.khronos.opengles.GL10;
import android.content.Context; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.util.Log; import android.view.MotionEvent;
public class MyGLSurfaceview extends GLSurfaceView{ MyGLRender myRender; float vertexArray[]=new float[]{ -0.8f,-0.4f*1.732f,0.0f, 0.8f,-0.4f*1.732f,0.0f, 0.0f,0.4f*1.732f,0.0f }; ByteBuffer vbb=ByteBuffer.allocateDirect(vertexArray.length*4); FloatBuffer fb; public MyGLSurfaceview(Context context) { super(context); // TODO Auto-generated constructor stub vbb.order(ByteOrder.nativeOrder()); fb=vbb.asFloatBuffer(); fb.put(vertexArray); fb.position(0); myRender=new MyGLRender();
setRenderer(myRender); }
@Override public boolean onTouchEvent(final MotionEvent event) { // TODO Auto-generated method stub queueEvent(new Runnable() { @Override public void run() { // TODO Auto-generated method stub myRender.setColor(event.getX() / getWidth(), event.getY() / getHeight(),1); } }); return super.onTouchEvent(event); } private class MyGLRender implements Renderer{
@Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub gl.glClearColor(mRed, mGreen,mBlue, 0.8f);//設置屏幕顏色 gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);// 清空緩存
}
@Override public void onSurfaceChanged(GL10 gl, int width, int height) { // TODO Auto-generated method stub gl.glViewport(0, 0, width, height);//設置窗口 }
@Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // TODO Auto-generated method stub } public void setColor(float r, float g, float b) { mRed = r%10; mGreen = g%10; mBlue = b%10; System.out.println("R "+mRed+" G"+mGreen+" B"+mBlue); } private float mRed; private float mGreen; private float mBlue; } }
package com.example.opengl_huizhisanjiaoxing;
import android.os.Bundle; import android.provider.Settings.Global; import android.app.Activity; import android.view.Menu;
public class MainActivity extends Activity {
MyGLSurfaceView GLview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLview=new MyGLSurfaceView(this); setContentView(GLview); }
@Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); GLview.onPause(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); GLview.onResume(); }
}