一、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上绘制的时候调用

三、搭建一个最基本的框架

按照以下步骤

  1. 新建一个Android项目
  2. 新建GLSurfaceView实例
  3. 创建渲染器Renderer实例
  4. 给GLSurfaceView设置Renderer实例
  5. 显示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中的屏幕坐标系如图所示

Android OpenGL ES学习笔记之实现OpenGL ES接口_第1张图片

OpenGl中的窗口坐标系

Android OpenGL ES学习笔记之实现OpenGL ES接口_第2张图片

onDrawFrame

它是在Surface上绘制的时候调用。

1.通过setRenderMode设置渲染模式,有两种供选择

 - GLSurfaceView.RENDERMODE_CONTINUOUSLY 不间断的绘制,默认渲染模式是这种 - GLSurfaceView.RENDERMODE_WHEN_DIRTY   在屏幕变脏时绘制,也就是当调用GLSurfaceView的requestRender ()方法后才会执行一次(第一次运行的时候会自动绘制一次)

2.调用glClear(GL10.GL_COLOR_BUFFER_BIT)方法清除屏幕颜色,执行这个方法之后,屏幕就会渲染之前通过glClearColor设置的清屏颜色.如下图所示

Android OpenGL ES学习笔记之实现OpenGL ES接口_第3张图片

如果设置渲染模式为GLSurfaceView.RENDERMODE_CONTINUOUSLY那么onDrawFrame方法会一直执行,看打印

Android OpenGL ES学习笔记之实现OpenGL ES接口_第4张图片

如果想看得更直观一点,那么打开手机开发者选项,打开显示Surface更新,你会看到屏幕一直在闪,眼睛都要亮瞎了。

四、总结

最基本的框架已经搭建完了,以后就在这个基础上进一步学习了。

更多相关文章

  1. Android屏幕尺寸适配注意事项
  2. 无法安装ADT(无法访问https://dl-ssl.google.com/android/eclipse
  3. android 几种发送短信的方法
  4. 【Android】一种提高Android应用进程存活率新方法
  5. 更改Android AVD模拟器创建路径位置的方法
  6. Android支付宝接口集成
  7. android 屏幕监听滑动事件
  8. Android’s HTTP Clients(Android的HTTP客户端接口)

随机推荐

  1. android studio查找应用控件id实现自动化
  2. android OTA更新
  3. android studio搭建JNI开发环境
  4. Android蓝牙一篇看懂
  5. [置顶] Android自定义控件系列九:从源码看
  6. Android 文件缓存方法
  7. Android(安卓)RxJava:2.0 相对于 1.0的更
  8. Android(安卓)Studio运行程序出现Session
  9. Android休闲游戏-快踩我-开发笔记
  10. Android 帧动画何时停止播放