Android的GLSurfaceView测试源码
2016-06-08 11:13
411 查看
public class MainActivity extends Activity { private GLSurfaceView mGLView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLView = new DemoGLSurfaceView(this); setContentView(mGLView); } public void onPause(){ super.onPause(); mGLView.onPause(); } public void onResume(){ super.onResume(); mGLView.onResume(); } protected void onDestroy() { super.onDestroy(); mGLView.destroyDrawingCache(); } } class DemoGLSurfaceView extends GLSurfaceView{ DemoRenderer mRenderer; public DemoGLSurfaceView(Context context) { super(context); //为了可以激活log和错误检查,帮助调试3D应用,需要调用setDebugFlags()。 //this.setDebugFlags(DEBUG_CHECK_GL_ERROR|DEBUG_LOG_GL_CALLS); mRenderer = new DemoRenderer(); this.setRenderer(mRenderer); } public boolean onTouchEvent(final MotionEvent event){ //由于DemoRenderer对象运行在另一个线程中,这里采用跨线程的机制进行处理。使用queueEvent方法 //当然也可以使用其他像Synchronized来进行UI线程和渲染线程进行通信。 this.queueEvent(new Runnable() { @Override public void run() { mRenderer.setColor(event.getX()/getWidth(), event.getY()/getHeight(), 1.0f); } }); return true; } } class DemoRenderer implements Renderer { private float mRed; private float mGreen; private float mBlue; //三角形的三个顶点 private FloatBuffer mTriangleBuffer; private float[] mTriangleArray = { 0f,1f,0f, -1f,-1f,0f, 1f,-1f,0f }; //正方形的四个顶点 private FloatBuffer quateBuffer ; private float[] mQuateArray = { -1f, -1f, 0f, 1f, -1f, 0f, -1f, 1f, 0f, 1f, 1f, 0f, }; private FloatBuffer mColorBuffer; private float[] mColorArray={ 1f,0f,0f,1f, //红 0f,1f,0f,1f, //绿 0f,0f,1f,1f //蓝 }; public void setColor(float r, float g, float b) { this.mRed = r; this.mGreen = g; this.mBlue = b; } @Override public void onDrawFrame(GL10 gl) { gl.glClearColor(mRed, mGreen, mBlue, 1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); //使用数组作为颜色 gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer); //绘制三角形 gl.glLoadIdentity(); gl.glTranslatef(-1.5f, 0.0f, -6.0f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // gl.glDisableClientState(GL10.GL_COLOR_ARRAY); gl.glFinish(); //绘制正方形 gl.glLoadIdentity(); gl.glTranslatef(1.5f, 0.0f, -6.0f); gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, quateBuffer); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); gl.glFinish(); } @Override public void onSurfaceChanged(GL10 gl, int w, int h) { gl.glViewport(0, 0, w, h); float ratio = (float) w / h; gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glShadeModel(GL10.GL_SMOOTH); gl.glClearColor(1.0f, 1.0f, 1.0f, 0f); gl.glClearDepthf(1.0f); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); mTriangleBuffer = floatToBuffer(mTriangleArray); mColorBuffer = floatToBuffer(mColorArray); quateBuffer = floatToBuffer(mQuateArray); } private static FloatBuffer floatToBuffer(float[] a){ //先初始化buffer,数组的长度*4,因为一个float占4个字节 ByteBuffer mbb = ByteBuffer.allocateDirect(a.length*4); //数组排序用nativeOrder mbb.order(ByteOrder.nativeOrder()); FloatBuffer mBuffer = mbb.asFloatBuffer(); mBuffer.put(a); mBuffer.position(0); return mBuffer; } }
相关文章推荐
- android 显示内容被底部导航栏遮挡
- android Launcher3双层改单层
- android开发中,可能会导致内存泄露的问题
- Android自定义控件之广告条滚动效果
- 极光推送集成安卓sdk
- android Manifest.xml选项
- 【Android基础知识】各种对话框的使用
- (Android)java虚拟机和Dalvik虚拟机的区别
- Android笔记之View XML属性自定义
- Android 运行崩溃找不到so包解决方案
- Android多媒体开发(5)————利用Android AudioTrack播放mp3文件
- Android的EventBus 详解(2.4及最新版3.0)[观察者模式]
- Android中自定义View,自定义布局
- Android开发相关的Blog推荐
- android存储路径
- Android版本更新时对SQLite数据库升级或者降级遇到的问题
- Android版本更新时对SQLite数据库升级或者降级遇到的问题
- Android 基础总结:( 二十三)JSON详解(下)
- Androidstudio初步学习问题2
- Android 基础总结:( 二十二)JSON详解(上)