一、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中的屏幕坐标系如图所示

OpenGl中的窗口坐标系

onDrawFrame

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

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

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

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

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

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

四、总结

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

更多相关文章

  1. 编程回忆之Android回忆(Android(安卓)调用短信服务)
  2. Android(安卓)调用系统的拍相程序进行录像
  3. 【Android】保存Bitmap到SD卡
  4. android答题系统(二):实现主界面入口和查询数据
  5. Android屏幕尺寸适配注意事项
  6. android activity onSearchRequested()
  7. Android(安卓)横屏不重启 Activity
  8. Android(安卓)限定 Activity 转向
  9. Android实现TextView动画缩放

随机推荐

  1. android常用控件(二)
  2. 基本Dalvik VM调用
  3. Android AVD启动失败
  4. Android签名验证简介
  5. Android(安卓)webview 常用配置
  6. Android原生运行uniapp使用5+app创建项目
  7. Android音频介绍
  8. android sdk content loader 一直显示0%
  9. [android] PhoneGap 在 android 下的实现
  10. 一键解决Ubuntu下安装Eclipse Android/C/