GLSurfaceView是 OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处。独到之处在哪?当使用Surfaceview无能为力、痛 不欲生时就只有使用GLSurfaceView了,它能够真正做到让Camera的数据和显示分离,所以搞明白了这个,像Camera只开预览不显示这都 是小菜,妥妥的。Android4.0的自带Camera源码是用SurfaceView预览的,但到了4.2就换成了GLSurfaceView来预 览。如今到了4.4又用了自家的TextureView,所以从中可以窥探出新增TextureView的用意。
虽 说Android4.2的Camera源码是用GLSurfaceView预览的,但是进行了大量的封装又封装的,由于是OpenGL小白,真是看的不知 所云。俺滴要求不高,只想弄个可拍照的摸清GLSurfaceView在预览Camera上的使用流程。经过一番百度一无所获,后来翻出去Google一 大圈也没发现可用的。倒是很多人都在用GLSurfaceView和Surfaceview同时预览Camera,Surfaceview用来预览数据, 在上面又铺了一层GLSurfaceView绘制一些信息。无奈自己摸索,整出来的是能拍照也能得到数据,但是界面上不是一块白板就是一块黑板啥都不显 示。后来在stackoverflow终于找到了一个可用的链接,哈哈,苍天啊,终于柳暗花明了!参考此链接,自己又改改摸索了一天才彻底搞定。之所以费这么多时间是不明白OpenGL ES2.0的绘制基本流程,跟简单的OpenGL的绘制还是稍有区别。下面上源码:
一、CameraGLSurfaceView.java 此类继承GLSurfaceView,并实现了两个接口
**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[copy](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[print](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[?](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[](https://code.csdn.net/snippets/402612)[](https://code.csdn.net/snippets/402612/fork) <div> </div> <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="24" height="13" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span style=<span class="string">“font-family:Comic Sans MS;font-size:18px;”</span>><span class="keyword">package</span> org.yanzi.camera.preview; - - <span class="keyword">import</span> javax.microedition.khronos.egl.EGLConfig; - <span class="keyword">import</span> javax.microedition.khronos.opengles.GL10; - - <span class="keyword">import</span> org.yanzi.camera.CameraInterface; - - <span class="keyword">import</span> android.content.Context; - <span class="keyword">import</span> android.graphics.SurfaceTexture; - <span class="keyword">import</span> android.opengl.GLES11Ext; - <span class="keyword">import</span> android.opengl.GLES20; - <span class="keyword">import</span> android.opengl.GLSurfaceView; - <span class="keyword">import</span> android.opengl.GLSurfaceView.Renderer; - <span class="keyword">import</span> android.util.AttributeSet; - <span class="keyword">import</span> android.util.Log; - - <span class="keyword">public</span> <span class="keyword">class</span> CameraGLSurfaceView <span class="keyword">extends</span> GLSurfaceView <span class="keyword">implements</span> Renderer, SurfaceTexture.OnFrameAvailableListener { - <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String TAG = <span class="string">“yanzi”</span>; - Context mContext; - SurfaceTexture mSurface; - <span class="keyword">int</span> mTextureID = –<span class="number">1</span>; - DirectDrawer mDirectDrawer; - <span class="keyword">public</span> CameraGLSurfaceView(Context context, AttributeSet attrs) { - <span class="keyword">super</span>(context, attrs); - <span class="comment">// TODO Auto-generated constructor stub</span> - mContext = context; - setEGLContextClientVersion(<span class="number">2</span>); - setRenderer(<span class="keyword">this</span>); - setRenderMode(RENDERMODE_WHEN_DIRTY); - } - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onSurfaceCreated(GL10 gl, EGLConfig config) { - <span class="comment">// TODO Auto-generated method stub</span> - Log.i(TAG, <span class="string">“onSurfaceCreated…”</span>); - mTextureID = createTextureID(); - mSurface = <span class="keyword">new</span> SurfaceTexture(mTextureID); - mSurface.setOnFrameAvailableListener(<span class="keyword">this</span>); - mDirectDrawer = <span class="keyword">new</span> DirectDrawer(mTextureID); - CameraInterface.getInstance().doOpenCamera(<span class="keyword">null</span>); - - } - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onSurfaceChanged(GL10 gl, <span class="keyword">int</span> width, <span class="keyword">int</span> height) { - <span class="comment">// TODO Auto-generated method stub</span> - Log.i(TAG, <span class="string">“onSurfaceChanged…”</span>); - GLES20.glViewport(<span class="number"></span>, <span class="number"></span>, width, height); - <span class="keyword">if</span>(!CameraInterface.getInstance().isPreviewing()){ - CameraInterface.getInstance().doStartPreview(mSurface, <span class="number">1</span>.33f); - } - - - } - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onDrawFrame(GL10 gl) { - <span class="comment">// TODO Auto-generated method stub</span> - Log.i(TAG, <span class="string">“onDrawFrame…”</span>); - GLES20.glClearColor(<span class="number">1</span>.0f, <span class="number">1</span>.0f, <span class="number">1</span>.0f, <span class="number">1</span>.0f); - GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); - mSurface.updateTexImage(); - <span class="keyword">float</span>[] mtx = <span class="keyword">new</span> <span class="keyword">float</span>[<span class="number">16</span>]; - mSurface.getTransformMatrix(mtx); - mDirectDrawer.draw(mtx); - } - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onPause() { - <span class="comment">// TODO Auto-generated method stub</span> - <span class="keyword">super</span>.onPause(); - CameraInterface.getInstance().doStopCamera(); - } - <span class="keyword">private</span> <span class="keyword">int</span> createTextureID() - { - <span class="keyword">int</span>[] texture = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">1</span>]; - - GLES20.glGenTextures(<span class="number">1</span>, texture, <span class="number"></span>); - GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texture[<span class="number"></span>]); - GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, - GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR); - GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, - GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); - GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, - GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); - GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, - GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); - - <span class="keyword">return</span> texture[<span class="number"></span>]; - } - <span class="keyword">public</span> SurfaceTexture _getSurfaceTexture(){ - <span class="keyword">return</span> mSurface; - } - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onFrameAvailable(SurfaceTexture surfaceTexture) { - <span class="comment">// TODO Auto-generated method stub</span> - Log.i(TAG, <span class="string">“onFrameAvailable…”</span>); - <span class="keyword">this</span>.requestRender(); - } - - } - </span> 关于这个类进行简单说明:
...