玩转Android Camera开发(三):国内首发—使用GLSurfaceView预览Camera 基础拍照demo
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> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family:Comic Sans MS;font-size:18px;”</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.camera.preview; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> javax.microedition.khronos.egl.EGLConfig; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> javax.microedition.khronos.opengles.GL10; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.camera.CameraInterface; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.SurfaceTexture; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLES11Ext; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLES20; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLSurfaceView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLSurfaceView.Renderer; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.AttributeSet; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.Log; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> CameraGLSurfaceView <span class="keyword" style="font-weight: bold; color: blue;">extends</span> GLSurfaceView <span class="keyword" style="font-weight: bold; color: blue;">implements</span> Renderer, SurfaceTexture.OnFrameAvailableListener { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">static</span> <span class="keyword" style="font-weight: bold; color: blue;">final</span> String TAG = <span class="string" style="color: red;">“yanzi”</span>; </span> - <span style="color: black;"> Context mContext; </span> - <span style="color: black;"> SurfaceTexture mSurface; </span> - <span style="color: black;"> DirectDrawer mDirectDrawer; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> CameraGLSurfaceView(Context context, AttributeSet attrs) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>(context, attrs); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated constructor stub</span> </span> - <span style="color: black;"> mContext = context; </span> - <span style="color: black;"> setEGLContextClientVersion(<span class="number" style="color: #c00000;">2</span>); </span> - <span style="color: black;"> setRenderer(<span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> setRenderMode(RENDERMODE_WHEN_DIRTY); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onSurfaceCreated(GL10 gl, EGLConfig config) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onSurfaceCreated…”</span>); </span> - <span style="color: black;"> mTextureID = createTextureID(); </span> - <span style="color: black;"> mSurface = <span class="keyword" style="font-weight: bold; color: blue;">new</span> SurfaceTexture(mTextureID); </span> - <span style="color: black;"> mSurface.setOnFrameAvailableListener(<span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> mDirectDrawer = <span class="keyword" style="font-weight: bold; color: blue;">new</span> DirectDrawer(mTextureID); </span> - <span style="color: black;"> CameraInterface.getInstance().doOpenCamera(<span class="keyword" style="font-weight: bold; color: blue;">null</span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onSurfaceChanged(GL10 gl, <span class="keyword" style="font-weight: bold; color: blue;">int</span> width, <span class="keyword" style="font-weight: bold; color: blue;">int</span> height) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onSurfaceChanged…”</span>); </span> - <span style="color: black;"> GLES20.glViewport(<span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, width, height); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(!CameraInterface.getInstance().isPreviewing()){ </span> - <span style="color: black;"> CameraInterface.getInstance().doStartPreview(mSurface, <span class="number" style="color: #c00000;">1</span>.33f); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onDrawFrame(GL10 gl) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onDrawFrame…”</span>); </span> - <span style="color: black;"> GLES20.glClearColor(<span class="number" style="color: #c00000;">1</span>.0f, <span class="number" style="color: #c00000;">1</span>.0f, <span class="number" style="color: #c00000;">1</span>.0f, <span class="number" style="color: #c00000;">1</span>.0f); </span> - <span style="color: black;"> GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); </span> - <span style="color: black;"> mSurface.updateTexImage(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span>[] mtx = <span class="keyword" style="font-weight: bold; color: blue;">new</span> <span class="keyword" style="font-weight: bold; color: blue;">float</span>[<span class="number" style="color: #c00000;">16</span>]; </span> - <span style="color: black;"> mSurface.getTransformMatrix(mtx); </span> - <span style="color: black;"> mDirectDrawer.draw(mtx); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onPause() { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onPause(); </span> - <span style="color: black;"> CameraInterface.getInstance().doStopCamera(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> createTextureID() </span> - <span style="color: black;"> { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] texture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[<span class="number" style="color: #c00000;">1</span>]; </span> - <span style="color: black;"> </span> - <span style="color: black;"> GLES20.glGenTextures(<span class="number" style="color: #c00000;">1</span>, texture, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texture[<span class="number" style="color: #c00000;"></span>]); </span> - <span style="color: black;"> GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR); </span> - <span style="color: black;"> GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); </span> - <span style="color: black;"> GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); </span> - <span style="color: black;"> GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> texture[<span class="number" style="color: #c00000;"></span>]; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> SurfaceTexture _getSurfaceTexture(){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mSurface; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onFrameAvailable(SurfaceTexture surfaceTexture) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onFrameAvailable…”</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.requestRender(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> 关于这个类进行简单说明: ...