Android的GLSurfaceView测试源码
16lz
2021-01-23
public class MainActivity extends Activity {private GLSurfaceView mGLView; @Overrideprotected 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;}@Overridepublic 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();}@Overridepublic 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();}@Overridepublic 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);//数组排序用nativeOrdermbb.order(ByteOrder.nativeOrder());FloatBuffer mBuffer = mbb.asFloatBuffer();mBuffer.put(a);mBuffer.position(0);return mBuffer;}}
更多相关文章
- 线程
- Android在子线程中更新UI的方法汇总(共七种)
- android学习笔记----多线程断点续传下载原理设计
- Android线程间通信的Message机制
- Android的线程使用来更新UI----View的几种更新方法(Thread、Hand
- Android之子线程更新UI
- Android 线程操作之线程池