Android-GLSurfaceView简单使用

来源:互联网 发布:js监听手机端软键盘 编辑:程序博客网 时间:2024/06/02 03:07

使用步骤:

第一步:

在布局中,摆布好GLSurfaceView的位置.如下:
<android.opengl.GLSurfaceView        android:id="@+id/glv_main"        android:layout_width="match_parent"        android:layout_height="200dp" />

第二步:

在Activity中实例化,如下:
@Override    protected void onCreate(Bundle savedInstanceState){    GLSurfaceView glv         = (GLSurfaceView)findViewById(R.id.glv_main);}

第三步:

获取足够的视图数据,然后新建数据提供者GLSurfaceView.Render, 创建GLRender类实现GLSurfaceView.Render接口,并且实现以下方法:
/** * Created by cm on 16/9/1. */public class GLRender implements GLSurfaceView.Renderer{    //控制旋转的角度    private float rotate;    @Override    public void onSurfaceCreated(GL10 gl,     EGLConfig config) {        //关闭抗抖动        gl.glDisable(GL10.GL_DITHER);        //设置系统对透视进行修正        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);        gl.glClearColor(0, 0, 0, 0);        //设置阴影平滑模式        gl.glShadeModel(GL10.GL_SMOOTH);        //启动深度测试        gl.glEnable(GL10.GL_DEPTH_TEST);        //设置深度测试的类型        gl.glDepthFunc(GL10.GL_LEQUAL);    }    @Override    public void onSurfaceChanged(GL10 gl, int width, int height) {        //设置3D视窗的大小及位置        gl.glViewport(0, 0, width, height);        //将当前矩阵模式设为投影矩形        gl.glMatrixMode(GL10.GL_PROJECTION);        //初始化单位矩阵        gl.glLoadIdentity();        //计算透视窗口的宽度高度比        float ratio = (float) width / height;        //调用此方法设置透视窗口的空间大小        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);    }    @Override    public void onDrawFrame(GL10 gl) {        //清除屏幕缓存和深度缓存        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);        //启用顶点坐标数据        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);        //启用顶点颜色数据        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);        //设置当前矩阵堆栈为模型堆栈        gl.glMatrixMode(GL10.GL_MODELVIEW);        //------绘制第一个图形-----        //重置当前的模型视图矩阵        gl.glLoadIdentity();        gl.glTranslatef(0.95f, -0.8f, -1.5f); //1️⃣        //设置顶点位置数据        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, PointData.floatBufferUtil(PointData.triangleData));        //设置顶点颜色数据        gl.glColorPointer(4, GL10.GL_FIXED, 0, PointData.intBufferUtil(PointData.triangleColor));        //根据顶点数据绘制平面图形        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);        //-----绘制第二个图形-----        //重置当前的模型视图矩阵        gl.glLoadIdentity();        gl.glTranslatef(0.95f, 0.8f, -1.5f);        //设置顶点位置数据        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, PointData.floatBufferUtil(PointData.rectData));        //设置顶点颜色数据        gl.glColorPointer(4, GL10.GL_FIXED, 0, PointData.intBufferUtil(PointData.rectColor));        //更具顶点数据绘制平面图形        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);        //-----绘制第三个图形----        //重置当前的模型视图矩阵        gl.glLoadIdentity();        gl.glTranslatef(-0.95f, 0.8f, -1.5f);        //设置顶点位置数据        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, PointData.floatBufferUtil(PointData.rectData2));        //根据顶点数据绘制平面图形        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);        //-----绘制第四个图形-----        //重置当前的模型视图矩阵        gl.glLoadIdentity();        gl.glTranslatef(-0.95f, -0.8f, -1.5f);        //设置使用纯色填充 **需要注意: 使用纯色填充需要禁用顶点颜色数组        gl.glColor4f(1.0f, 0.2f, 0.2f, 0.0f);        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);        //设置顶点位置数据        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, PointData.floatBufferUtil(PointData.pentacle));        //根据顶点数据绘制图形        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 5);        //----绘制第五个图形---        //重置当前的模型视图矩阵        gl.glLoadIdentity();        gl.glTranslatef(0f, 0f, -1.5f);        gl.glRotatef(rotate, 0f, 0.2f, 0f);        //设置顶点位置数据        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, PointData.floatBufferUtil(TDPointData.taperVertices));        //启用顶点颜色组        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);        //设置顶点颜色数据        gl.glColorPointer(4, GL10.GL_FIXED, 0, PointData.intBufferUtil(TDPointData.taperColors));        //按taperFacetsBuffer指定的面绘制三角形        ByteBuffer byteBuffer = PointData.byteBufferUtil(TDPointData.taperFacets);        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, byteBuffer.remaining(), GL10.GL_UNSIGNED_BYTE, byteBuffer);        //绘制结束        gl.glFinish();        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);        //旋转角度+1        rotate += 1;    }}

第四步:

将提供者与GLSurfaceView对接如下:
@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_glsurface);        glv = (GLSurfaceView)findViewById(R.id.glv_opengl);        GLRender render = new GLRender();        glv.setRenderer(render);    }
0 0