一、GLSurfaceView介紹
在Android平臺上實現OpenGL的view很簡單,只需要用到GLSurfaceView和GLSurfaceView.Renderer。
GLSurfaceView是用來連接OpenGL ES和android的view結構的.GLSurfaceView位於android.opengl包類,繼承自SurfaceView
public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
......
}
二、GLSurfaceView.Renderer介紹
Renderer也叫渲染器,是一個接口,位於GLSurfaceView類中.
public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
......
public interface Renderer {
void onSurfaceCreated(GL10 gl, EGLConfig config);
void onSurfaceChanged(GL10 gl, int width, int height);
void onDrawFrame(GL10 gl);
......
}
}
提供了三個方法
- onSurfaceCreated -------- 在Surface創建的時候調用
- onSurfaceChanged-------- 在Surface改變的的時候調用
- onDrawFrame ------------- 在Surface上繪製的時候調用
三、搭建一個最基本的框架
按照以下步驟
- 新建一個Android項目
- 新建GLSurfaceView實例
- 創建渲染器Renderer實例
- 給GLSurfaceView設置Renderer實例
- 顯示GLSurfaceView
一言不合貼代碼
public class MainActivity extends Activity {
private GLSurfaceView glSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果本設備支持OpenGl ES 2.0
if (IsSupported()) {
//新建GLSurfaceView實例
glSurfaceView = new GLSurfaceView(this);
// 創建渲染器實例
MyRenderer mRenderer = new MyRenderer();
// 設置渲染器
glSurfaceView.setRenderer(mRenderer);
//顯示SurfaceView
setContentView(glSurfaceView);
}
}
IsSupported()方法的代碼如下
private boolean IsSupported() {
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000;
return supportsEs2;
}
實際中我們以後所有的處理都實現在MyRenderer這個接口的實現類,我在這裏顯示一個綠色的空白屏幕
public class MyRenderer implements GLSurfaceView.Renderer {
// Surface創建的時候調用
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 設置清屏顏色
gl.glClearColor(0f, 1f, 0f, 0f);
}
// Surface改變的的時候調用
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 設置窗口大小
gl.glViewport(width / 4, width / 2, width / 2, height / 2);
}
// 在Surface上繪製的時候調用
@Override
public void onDrawFrame(GL10 gl) {
//設置渲染模式
glSurfaceView. setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
// 清除屏幕
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
}
最後爲了配合Activity的生命週期,我們加上如下代碼
@Override
protected void onPause() {
super.onPause();
if (glSurfaceView != null) {
glSurfaceView.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
if (glSurfaceView != null) {
glSurfaceView.onResume();
}
}
我詳細的介紹以下三個方法.
onSurfaceCreated
它是在Surface創建的時候調用,可以在這裏進行一些初始化操作,它攜帶兩個參數GL10 和 EGLConfig。
- GL10 繼承自GL的一個接口,封裝了程序語言爲OpenGL綁定的核心功能,我們可以把它理解爲一個“畫筆”,操作它提供的的方法來在GLSurfaceView上這塊“畫布”繪製
- EGLConfig 是一個抽象類,但是沒有任何實現,不管它
我在這裏調用gl.glClearColor(0f, 1f, 0f, 0f)設置清屏顏色爲綠色,所謂清屏顏色就是當開始繪製時,屏幕所顯示的顏色。glClearColor(float red, float green, float blue, float alpha)四個參數對應紅、綠、藍、透明度。這裏的取值範圍是0到1f。不是RGB中0~255。
onSurfaceChanged
它是在Surface大小改變的時候調用,這個方法只會執行一次,Surface創建時初始大小爲0,所以需要指定窗口大小,調用glViewport(int x, int y, int width, int height)方法傳入四個參數,x,y座標和寬高。
這裏要注意一點,這個窗口座標原點是位於屏幕左下角,與android中的屏幕座標系不一樣
Android中的屏幕座標系如圖所示
OpenGl中的窗口座標系
onDrawFrame
它是在Surface上繪製的時候調用。
1.通過setRenderMode設置渲染模式,有兩種供選擇
- GLSurfaceView.RENDERMODE_CONTINUOUSLY 不間斷的繪製,默認渲染模式是這種
- GLSurfaceView.RENDERMODE_WHEN_DIRTY 在屏幕變髒時繪製,也就是當調用GLSurfaceView的requestRender ()方法後纔會執行一次(第一次運行的時候會自動繪製一次)
2.調用glClear(GL10.GL_COLOR_BUFFER_BIT)方法清除屏幕顏色,執行這個方法之後,屏幕就會渲染之前通過glClearColor設置的清屏顏色.如下圖所示
如果設置渲染模式爲GLSurfaceView.RENDERMODE_CONTINUOUSLY那麼onDrawFrame方法會一直執行,看打印
如果想看得更直觀一點,那麼打開手機開發者選項,打開顯示Surface更新,你會看到屏幕一直在閃,眼睛都要亮瞎了。
四、總結
最基本的框架已經搭建完了,以後就在這個基礎上進一步學習了。