android-opengl-canvas里代替GLSurfaceView的GLTextureView

本文主要說明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)行查閱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容