二、我们的第一个OpenGL工程
以下我们就通过代码来说明具体的OpenGL的应用了。那么这个示例最终要达到的效果是,当我们的手在屏幕上滑动的时候屏幕的背景颜色也就跟着改变(可以用来检测屏幕的坏点,呵呵O(∩_∩)O~)。
2.1、咱先创建一个工程,工程名字为OpenGL3D01,我们有这样的三个文件,名字分别为:
MainActivity.java
OpenGLView.java
OpenGLRenderer.java
这里我们因为是做OpenGL的东西,所以暂时就不需要布局的.xml文件,因为视图就是由我们的OpenGL自己画出来的。
2.1.1、OpenGLRenderer.java
package com.macrocheng.opengl3d01;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView;
public class OpenGLRenderer implements GLSurfaceView.Renderer {
private static final String LOG = OpenGLRenderer.class.getSimpleName();
private float red = 0.9f;
private float green = 0.2f;
private float blue = 0.2f;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
gl.glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
/**
* 我们通过glClearColor()方法为底色定义了颜色。
* 底色是在我们能看到的所有东西的后面,所以所有在底色后面的东西都是不可见的。
* 可以想象这种东西为浓雾,挡住了所有的东西。
*/
gl.glClearColor(red, green, blue, 1.0f);
//清除颜色的Buffer然后让现实上面我们通过glClearColor来定义的颜色
/**
* 为了让颜色变化可见,我们必须调用glClear()以及颜色缓冲的Mask来清空buffer,
* 然后为我们的底色使用新的底色。
*/
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
/**
* 设置颜色的值
* @param r Red值
* @param g Green值
* @param b Blue值
*/
public void setColor(float r,float g,float b)
{
red = r;
green = g;
blue = b;
}
}
我们实现了GLSurfaceView.Renderer这个接口,然后要实现它的三个方法:
onSurfaceCreated():在surface创建以后调用
onSurfaceChanged():在surface发生改变以后调用,例如从竖屏切换到横屏的时候
onDrawFrame():画图的时候调用,系统会一直调用这个方法反复的来画图
2.1.2、OpenGlView.java
package com.macrocheng.opengl3d01;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;
public class OpenGLView extends GLSurfaceView {
private static final String LOG = OpenGLView.class.getSimpleName();
private OpenGLRenderer or;
public OpenGLView(Context context) {
super(context);
// TODO Auto-generated constructor stub
or = new OpenGLRenderer();
setRenderer(or);
}
// 监听touch事件,用来改变颜色
public boolean onTouchEvent(final MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE
|| event.getAction() == MotionEvent.ACTION_DOWN) {
queueEvent(new Runnable() {
public void run() {
or.setColor(event.getX() / getWidth(), event.getY()
/ getHeight(), 1.0f);
}
});
}
return true;
}
}
这个代码没有太多要说的,继承了GLSurfaceView类目的就是要将我们画出来的OpenGL图像作为View显示出来。
2.1.3、MainActivity.java
package com.macrocheng.opengl3d01;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 隐去电池等图标和一切修饰部分(状态栏部分)
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 隐去标题栏(程序的名字)
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new OpenGLView(this));
}
}
2.2、完成后程序运行的效果截图:
当手指滑动是颜色会跟着改变
|