本文主要說明GLTextureView,一個代替GLSurfaceView的自定義View。將會說明包括GLTextureView的優(yōu)點,大致實現(xiàn)方式,以及使用。
一如既往地放項目地址:
android-openGL-canvas
本文相關(guān)的代碼:
BaseGLTextureView
優(yōu)點
其實Android官方在Android 4.0以后推出TextureView,本意就是想代替GLSurfaceView??墒荰extureView在里面并沒有像GLSurfaceView那樣封裝好一個繪制線程以及OpenGL的初始化。所以GLTextureView將會實現(xiàn)這些部分。
GLTextureView的優(yōu)點其實也包括TextureView的優(yōu)點,在官方文檔里也有說明: TextureView 不會創(chuàng)建一個分離的window,而是像一個普通的view那樣顯示, 這樣就不會像GLSurfaceView那樣,要么在所有View上方,要么被其它View遮住(看 setZOrderOnTop(boolean) 的說明)。而且像myView.setAlpha(0.5f)這種方法調(diào)用后也會有效果了。
實現(xiàn)方式
實現(xiàn)需要使用GLThread,這是由GLSurfaceView.GLThread改造過來的類,關(guān)于這個類的說明請看
如何封裝 opengl 流程 -- 以為android-opengl-canvas例
利用GLThread,實現(xiàn)過程就變得很簡單了,以下是關(guān)鍵代碼:
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
...
glThreadBuilder.setRenderMode(getRenderMode())
.setSurface(surface)
.setRenderer(renderer);
...
}
...
mGLThread = glThreadBuilder.createGLThread();
mGLThread.start();
...
mGLThread.surfaceCreated();
mGLThread.onWindowResize(w, h);
...
public void requestRender() {
if (mGLThread != null) {
mGLThread.requestRender();
}
}
可以看到,主要就是先實現(xiàn)TextureView.SurfaceTextureListener,然后在onSurfaceTextureAvailable時創(chuàng)建GLThread,傳入自己的SurfaceTexture用于承載繪制的內(nèi)容,就基本可以了。
以上代碼里的setRenderer,就實現(xiàn)了像GLSurfaceView那樣使用Renderer就可以實現(xiàn)繪制了。
剩下的就是流程控制的代碼了。
public void onPause() {
if (mGLThread != null) {
mGLThread.onPause();
}
}
public void onResume() {
if (mGLThread != null) {
mGLThread.onResume();
}
}
protected void surfaceDestroyed() {
// Surface will be destroyed when we return
mGLThread.surfaceDestroyed();
}
public void requestRender() {
if (mGLThread != null) {
mGLThread.requestRender();
}
}
實現(xiàn)就是這么簡單。
使用
那么看看使用:
public class GLTextureView extends BaseGLTextureView implements GLSurfaceView.Renderer
...
setRenderer(this);
...
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
mCanvas = new CanvasGL();
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
mCanvas.setSize(width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
mGL = gl;
mCanvas.clearBuffer(backgroundColor);
onGLDraw(mCanvas);
}
protected abstract void onGLDraw(ICanvasGL canvas);
這里使用了封裝好的canvasgl。
只要繼承以上代碼所在的類就可以啦。
@Override
protected void onGLDraw(ICanvasGL canvas) {
canvas.drawBitmap(bitmap, 0, 0);
}
效果圖

上圖左邊就是GLTextureView的效果,右圖是GPUImage的效果,知道這個庫的應(yīng)該知道它的內(nèi)部實現(xiàn)就是用GLSurfaceView的吧。那么,就可以看看TextureView和GLSurfaceView的表現(xiàn)有什么區(qū)別了。
詳細(xì)的請進(jìn)入github地址進(jìn)行查閱。