一、OpenGL ES使用
1、继承GLSurfaceView
public class MyGLSurfaceView extends GLSurfaceView {
private static String TAG = "MyGlRender";
private MyGlRender wlGlRender;
public MyGLSurfaceView(Context context) {
this(context, null);
Log.i(TAG, "MyGLSurfaceView()");
}
public MyGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.i(TAG, "MyGLSurfaceView()");
wlGlRender = new MyGlRender();
setRenderer(wlGlRender);
}
}
2、实现接口GLSurfaceView.Renderer,其中包含三个方法:
void onSurfaceCreated(GL10 gl, EGLConfig config);
void onSurfaceChanged(GL10 gl, int width, int height);
void onDrawFrame(GL10 gl);
public class MyGlRender implements GLSurfaceView.Renderer{
private static String TAG = "wq892373445";
public MyGlRender()
{
Log.e(TAG, "MyGlRender()");
}
//surface创建的时候调用,一般在该方法中启动绘图的线程。
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.e(TAG, "onSurfaceCreated()");
}
//surface尺寸发生改变的时候调用,如横竖屏切换
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
Log.e(TAG, "onSurfaceChanged()"+width+"=="+height);
//x,y 以像素为单位,指定了视口的左下角位置。
//width,height 表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口
GLES20.glViewport(0, 0, width, height);
}
//onDrawFrame()该方法会不断的刷新调用
@Override
public void onDrawFrame(GL10 gl) {
Log.e(TAG, "onDrawFrame()");
//把窗口清除为当前颜色
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
//清除深度缓冲区
//GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT);
//glClear清除颜色缓冲区时指定RGBA值(也就是所有的颜色都会被替换成指定的RGBA值)。每个值的取值范围都是0.0~1.0,超出范围的将被截断
GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
}
}
3、布局中使用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<com.wq.opengldemo.MyGLSurfaceView
android:layout_width="match_parent"
android:layout_height="300dp"
/>
<com.wq.opengldemo.MyGLSurfaceView
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="300dp"
/>
</LinearLayout>
4、打印执行流程
GLThread:OpenGL ES的运行线程。包含创建EGL环境、调用GLRender的onSurfaceCreated、onSurfaceChanged和onDrawFrame方法以及生命周期的管理。,其中onDrawFrame一直在执行
onDrawFrame:这个方法大体的原理是开起一个线程,在此线程内不断的调用onDrawFrame,以实现动画效果。因此onDrawFrame的主要作用就是将不同的图片显示出来就可以了
EglHelper:负责创建EGL环境。
GLSurfaceView:负责提供Surface和状态改变。
12-05 18:14:48.728 25591 25591 I MyGlRender: MyGLSurfaceView()
12-05 18:14:48.728 25591 25591 I MyGlRender: MyGlRender()
12-05 18:14:49.066 25591 29235 I MyGlRender: onSurfaceCreated()
12-05 18:14:49.066 25591 29235 I MyGlRender: onSurfaceChanged()
12-05 18:14:49.066 25591 29235 I MyGlRender: onDrawFrame()
12-05 18:14:49.104 25591 29235 I MyGlRender: onDrawFrame()
5、最后效果