今天介绍下GLSurfaceView如何使用。GLSurfaceView的包名是android.opengl,由此可以它是opengl的一个类,它也可以预览camera,而且在预览camera上有比SurfaceView独特的优势,可以做到数据和显示的分离,比如在没有屏幕的设备照样可以开预览实时直播。下面要介绍的这个例子是获取camera预览数据编码为视频流。但这篇文章只介绍如何使用GLSurfaceView去预览,关于获取预览数据编码视频流后续会介绍。
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.opengl.GLES11Ext;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.util.AttributeSet;
import android.util.Log;
public class MyGLSurfaceView extends GLSurfaceView implements
Renderer, SurfaceTexture.OnFrameAvailableListener {
private static final String TAG = "MyGLSurfaceView";
private Context mContext;
private SurfaceTexture mSurface;
private int mTextureID = -1;
private CameraDrawer mCameraDrawer;
public CameraGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mContext = context;
setEGLContextClientVersion(2);
setRenderer(this);
setRenderMode(RENDERMODE_WHEN_DIRTY);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
Log.i(TAG, "onSurfaceCreated...");
mTextureID = createTextureID();
mSurface = new SurfaceTexture(mTextureID);
mSurface.setOnFrameAvailableListener(this);
mCameraDrawer = new CameraDrawer(mTextureID);
CameraWrapper.getInstance().doOpenCamera(null);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
Log.i(TAG, "onSurfaceChanged..." + width + "/" + height);
GLES20.glViewport(0, 0, width, height);
if(!CameraWrapper.getInstance().isPreviewing()){
CameraWrapper.getInstance().doStartPreview(mSurface);
}
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
Log.i(TAG, "onDrawFrame...");
GLES20.glClear