package com.example.datalibrary.deptrum; import android.content.Context; import android.opengl.GLSurfaceView; import android.util.AttributeSet; public class GLFrameSurface extends GLSurfaceView { private ICallback cb = null; private GLFrameRenderer mRenderer; public GLFrameSurface(Context context) { super(context); init(); } public GLFrameSurface(Context context, AttributeSet attrs) { super(context, attrs); init(); } private synchronized void init() { if (mRenderer == null) { setEGLContextClientVersion(2); mRenderer = new GLFrameRenderer(this); this.setRenderer(mRenderer); setRenderMode(RENDERMODE_WHEN_DIRTY); } else { if (this.getCurrentRenderer() == null) { this.setRenderer(mRenderer); setRenderMode(RENDERMODE_WHEN_DIRTY); } } } public GLFrameRenderer getCurrentRenderer() { return mRenderer; } public void setCallback(ICallback cb) { this.cb = cb; } @Override public void setRenderer(Renderer renderer) { super.setRenderer(renderer); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); } @Override protected void onAttachedToWindow() { // Utils.LOGD("surface onAttachedToWindow()"); super.onAttachedToWindow(); init(); // setRenderMode() only takes effectd after SurfaceView attached to window! // note that on this mode, surface will not render util GLSurfaceView.requestRender() is // called, it's good and efficient -v- // “WHEN_DIRTY”是由用户调用requestRenderer()绘制 // Utils.LOGD("surface setRenderMode RENDERMODE_WHEN_DIRTY"); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (w > 0 && h > 0) { if (null != cb) { cb.onSizeChanged(w, h); } } } public interface ICallback { void onSizeChanged(int w, int h); } }