SurfaceView和GLSurfaceView

因为所有的案例通过java实现,所以需要了解一下surfaceView和GLSurfaceView,他们作为绘制的载体,我们绘制的东西需要绘制到它们上面,

GLSurfaceView和SurfaceView的区别

  • GLSurfaceView管理了EGL的相关创建部分,不需要自己常见,并且使用的时候只需要调用三个声明周期函数。SurfaceView使用的时候需要自己创建EGL相关的内容
  • GLSurfaceView不需要自己创建线程,SurfaceView需要自己创建绘制线程。

GLSurfaceView是SurfaceView的一个封装,它的功能比SurfaceView强大。

使用SurfaceView实现出简易的GLSurfaceView

  • 我们使用SurfaceView来实现一个简易的GLSurfaceView,所以继承SurfaceView。
public class EGLGLSurfaceView extends SurfaceView implements SurfaceHolder.Callback 
  • 实现接口,需要一下几个方法
 @Override
    public void surfaceCreated(SurfaceHolder holder) {
        
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

我们在创建方法执行的时候创建绘制线程。

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        startGLThreads();
    }

基本就那么多,下来主要是线程中需要做什么?

  • 创建一个EGL(会有一章专门来讲解)
 EGL10 egl10 = (EGL10) EGLContext.getEGL();
 //获取表面   得到默认的表面
 EGLDisplay eglDisplay = egl10.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
//初始化 
egl10.eglInitialize(eglDisplay, new int[2]);
EGLConfig[] configs = new EGLConfig[1];
//匹配的EGLConfigs
egl10.eglChooseConfig(eglDisplay,
                    new int[]{EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE},
                    configs,
                    1,
                    new int[1]);
EGLConfig eglEGLConfig = configs[0];
//创建渲染窗口
EGLSurface eglSurface = egl10.eglCreateWindowSurface(eglDisplay, eglEGLConfig, EGLGLSurfaceView.this.getHolder(), null);
//创建渲染上下文
EGLContext eglContext = egl10.eglCreateContext(eglDisplay, eglEGLConfig, EGL10.EGL_NO_CONTEXT, null);
//使得一个上下文成为当前   绘制前需要到一个操作
egl10.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
mGL10 = (GL10) eglContext.getGL();
// 刷帧
while (isKeyFlag()) {
      gl.glClearColor(1, 0,0, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
//交换 缓存区
       egl10.eglSwapBuffers(eglDisplay, eglSurface);
}

在surfaceDestroyed调用

       egl10.eglMakeCurrent(eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE,
                    EGL10.EGL_NO_CONTEXT);
            egl10.eglDestroyContext(eglDisplay, eglContext);
            egl10.eglDestroySurface(eglDisplay, eglSurface);
            mGL10 = null;
  • 创建open gl es相关的,在是一个循环来绘制图形。
gl.glClearColor(1, 0,0, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

将整个屏幕变为红色。
上面就是基本SurfaceView封装成为GLSurfaceView最核心的操作。

GLSurfaceView绘制

只需要书写opengl代码就可以了,其它操作已经被封装掉了。
做出与上面相同的操作只需要执行先的一些代码


public class xxx extends GLSurfaceView implements GLSurfaceView.Renderer {
    public xxx(Context context) {
        super(context);
    }

    public xxx(Context context, AttributeSet attrs) {
        super(context, attrs);
        setRenderer(this);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

    }

    @Override
    public void onDrawFrame(GL10 gl) {
        gl.glClearColor(1, 0,0, 1.0f);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }
}
上一篇:第1年10月11日 android canvas


下一篇:php-Laravel:雄辩的Querybuilder whereTimestamp?