android-glsurfaceview Activity框架程序
两个基本的类让我们使用OpenGL ES API来创建和操纵图形:GLSurfaceView和 GLSurfaceView.Renderer。
1. GLSurfaceView:
这是一个视图类,你可以调用OpenGL API在上面绘制图形和操纵物体,功能和SurfaceView相似。我们可以创建一个GLSurfaceView类的实例,并添加自己的渲染器。如果我们要自己实现一些触摸屏的操作,我们必须扩展这个类来实现触摸监听器。
2. GLSurfaceView.Renderer
这个接口定义了在一个OpenGL的GLSurfaceView中绘制图形所需要的方法。我们必须在一个单独的类中为这些接口提供实现,并使用GLSurfaceView.setRenderer()方法将它依附到GLSurfaceView实例对象上。
我们需要实现GLSurfaceView.Renderer的以下方法:
a) onSurfaceCreated():系统在创建GLSurfaceView时调用它一次。我们可以使用它来设置OpenGL的环境变量,或是初始化OpenGL的图形物体。
b) onDrawFrame():系统在每次重绘GLSurfaceView时调用这个方法。这个方法主要完成绘制图形的操作。
c) onSurfaceChanged():系统在GLSurfaceView的几何属性发生改变时调用该方法,包括大小或是设备屏幕的方向发生变化。例如,系统在屏幕从直立变为水平使调用它。这个方法主要用来对GLSurfaceView容器的变化进行响应。
3.使用步骤
a.定义render
public class SunnyGLRender implements GLSurfaceView.Renderer { public float mAngle;
float one = 0.5f;
private FloatBuffer triggerBuffer2 = BufferUtil.floatToBuffer(new float []{
0,one,0, //上顶点
-one,-one,0, //左下点
one,-one,0,}); //右下点
private FloatBuffer triggerBuffer1 = BufferUtil.floatToBuffer(new float []{
0,one,0, //上顶点
-one,-one,0, //左下点
one,-one,0,}); //右下点
private float[] mTriangleArray = {
// X, Y, Z 这是一个等边三角形
-0.5f, -0.25f, 0,
0.5f, -0.25f, 0,
0.0f, 0.559016994f, 0 }; @Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) { //GLES30:为OpenGL ES2.0版本,相应的
//GLES30:OpenGL ES3.0
//黑色背景
gl.glClearColor(0.0f, 0f, 1f, 0.5f);
//gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// 启用顶点数组(否则glDrawArrays不起作用)
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); } @Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
//mProgram = GLES30.glCreateProgram();
//Log.e("zcxgl", "Could not link program: mProgram = "+mProgram);
Log.e("zcxgl","onSurfaceChanged");
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION); // 设置当前矩阵为投影矩阵
gl.glLoadIdentity(); // 重置矩阵为初始值
//gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 根据长宽比设置投影矩阵
gl.glFrustumf(-ratio, ratio, -1, 1, 5, 6); }
private FloatBuffer colorBuffer2 = BufferUtil.floatToBuffer(new float[]{
one,0,0,one,
0,one,0,one,
0,0,one,one,
});
@Override
public void onDrawFrame(GL10 gl) {
// Redraw background color
Log.d("zcxgl","onDrawFramew");
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); /************ 启用MODELVIEW模式,并使用GLU.gluLookAt()来设置视点 ***************/
// 设置当前矩阵为模型视图模式
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity(); // reset the matrix to its default state
// 设置视点
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
/*****************************************/ long time = SystemClock.uptimeMillis() % 4000L;
mAngle = 0.090f * ((int)time);
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 移动绘图原点的坐标与上面的语句连用就相当于设置新的绘图远点坐标,
//gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);//后面的1-10是指图像的1-10层,
// 图像所处层次越大,在屏幕上显示就越小。默认为(0,0,1),
// 左移 1.5 单位,并移入屏幕 6.0。
gl.glTranslatef(0f, 0.0f, -5.0f); gl.glRotatef(mAngle, 0.0f, 0.0f, 1.0f);
//启用平滑着色
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//
//gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);//可以直接设置绘图的单调颜色
// 设置三角形点
// gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,triggerBuffer2);
//设置平滑着色的颜色矩阵
gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuffer2);//都是一维矩阵,因此第一个参数就是表示一个颜色的长度表示
//绘制
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
// 关闭颜色平滑着色设置
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
//gl.glFinish(); }
}
2.使用glsurfaceview 并设置render
private GLSurfaceView mGLSurfaceView;
static class BufferUtil {
public static FloatBuffer mBuffer; public static FloatBuffer floatToBuffer(float[] a) {
// 先初始化buffer,数组的长度*4,因为一个float占4个字节
ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
// 数组排序用nativeOrder
mbb.order(ByteOrder.nativeOrder());
mBuffer = mbb.asFloatBuffer();
mBuffer.put(a);
mBuffer.position(0);
return mBuffer;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
mGLSurfaceView.setRenderer(new SunnyGLRender());
setContentView(mGLSurfaceView);
} @Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
} @Override
protected void onPause() {
super.onPause();
mGLSurfaceView.onPause();
} private void initView() {
mGLSurfaceView = new GLSurfaceView(this);
}
3.效果
android-glsurfaceview Activity框架程序的更多相关文章
- Android之Activity框架
在安卓应用中,经常需要Activity中经常需要有大量相似的Activity类,这些类往往有相似的结构与功能,因此产生了大量重复代码,为此,以下提供一种方法有效的降低了代码冗余. 定义Activity ...
- Android开源测试框架学习
近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料. Android测试大致分三大块: 代码层测试 用户操作模拟,功能测试 安装部署及稳定性测试 代码层测试 对于一般java ...
- [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
- Android课程---Activity的创建
一.为了创建一个新的Activity,你需要继承Activity类,定义UI,实现功能.新的Activity的最基本的框架代码如下所示: package com.paad.myapplication; ...
- Android之activity初讲
前天我们已经成功创建了第一个Android项目,如果我要把软件推荐给我的第一个用户,毫无疑问是从界面开始介绍.因为即使你的程序算法再高效,架构再出色,用户根本不会在乎这些,他们一开始只会对看到的东西感 ...
- Android aidl Binder框架浅析
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?B ...
- 详解Android首选项框架ListPreference
详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...
- Android GLSurfaceView用法详解(二)
输入如何处理 若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...
- Android的MVC框架
http://www.cnblogs.com/wanghafan/archive/2012/07/20/2600786.html MVC是当前比较流行的框架,随便Google下,就可以发现几乎所有的应 ...
随机推荐
- 什么是Java序列化,如何实现java序列化
简要解释: 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是为了解决在对对象流进行读写操作时所 ...
- ATS配置自定义日志
修改records.config,开启日志自定义功能 更改日志目录,默认日志存放在/var/log/trafficserver: CONFIG proxy.config.log.logfile_dir ...
- BBS(第二天) Django之Admin 自动化管理数据页面 与创建一个用户注册的验证码
1.admin的概念 # Admin是Django自带的一个功能强大的自动化数据管理界面 # 被授权的用户可以直接在Admin中操作数据库 # Django提供了许多针对Admin的定制功能 2. 配 ...
- django-内网项目上线测试部署步骤
1.安装python环境 由于测试环境只有内网,所以在外网同系统上安装python. wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5 ...
- model.form使用,配合form的钩子
一次model.form的使用记录,配合form钩子的过程 在写信息采集功能的时候,需要添加资产信息,使用modelform组件减少工作量 官网介绍:版本1.9.https://docs.django ...
- Win32API标准模板
#include<Windows.h> LRESULT CALLBACK WndProc //处理发送到窗口的消息的应用程序定义的函数.wndproc类型定义指向此回调函数的指针. //W ...
- datatables插件提示Cannot reinitialise DataTable的解决办法
这个错误是由于重新设置数据源,又没有将原来的数据清空导致的. 网上有很多解决方案,试了都不管用. 最后找到一种方法,将原来的table销毁,再初始化. 方法是在datatable初始化的时候加入属性 ...
- vi怎么统计查找字符串的个数
vi怎么统计查找字符串的个数 用vi打开一个比较大的文本,用vi查找指定字符串,现在怎么统计该字符串的个数呢?比如我查找ORA字符串,直接输入 /ORA的时候vi会高亮显示.现在怎么统计ORA的个数呢 ...
- python 网络编程 缓冲和粘包
tcp:属于长连接,与一个客户端进行连接了以后,其他的客户端要等待,要连接另外一个,必须优雅的断开前面这个客户端的连接. 允许地址重用:在bind IP地址和端口之前加上,# server.setso ...
- c#: 任务栏进度显示(TaskbarManager)
Win7及以上系统支持任务栏进度条,为有进度类应用显示进度于任务栏,甚为方便. 以c#之WinForm实现其,大多采用Windows API Code Pack这个方案,加多引用,比较繁琐,而我总也打 ...