5.3向OpenGL旋转立方体添加控件
问题
您要使用设备的键盘与OpenGL多边形进行交互。
解
创建自定义GLSurfaceView并覆盖onKeyUp方法来侦听从方向键(D-pad)创建的KeyEvent。
讨论
这个食谱建立在配方5.2,显示如何使用D-pad控制立方体。我们将使用D-pad的方向键沿x轴和y轴增加速度旋转。这个配方最大的变化是,我们现在有了扩展SurfaceView的自定义类。我们这样做,以便我们可以覆盖onKeyUp方法,并在用户使用D-pad时收到通知。
我们的Activity的onCreate类似于Example 5-6。
实例5-6。旋转立方体活动
我们的新GLSurfaceView也实现了Renderer接口。 onSurfaceCreated和onSurfaceChanged方法与Recipe中的完全相同
5.2;大多数更改发生在onDrawFrame中,因为我们引入了四个新参数:mXrot和mYrot控制立方体沿x轴和y轴的旋转,mXspeed和mYSpeed存储沿x轴和y轴的旋转速度,轴和y轴。每次用户点击D-pad按钮,我们通过修改这些参数来改变立方体的速度。
例5-7显示了我们新类的完整代码。
实例5-7。 GLSurfaceView实现
立方体继承自Recipe 5.2。不要忘记在视图的构造函数中调用requestFocus()和setFocusableInTouchMode(true),否则将不会接收键事件。
问题
您要使用设备的键盘与OpenGL多边形进行交互。
解
创建自定义GLSurfaceView并覆盖onKeyUp方法来侦听从方向键(D-pad)创建的KeyEvent。
讨论
这个食谱建立在配方5.2,显示如何使用D-pad控制立方体。我们将使用D-pad的方向键沿x轴和y轴增加速度旋转。这个配方最大的变化是,我们现在有了扩展SurfaceView的自定义类。我们这样做,以便我们可以覆盖onKeyUp方法,并在用户使用D-pad时收到通知。
我们的Activity的onCreate类似于Example 5-6。
实例5-6。旋转立方体活动
public class SpinningCubeActivity2 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// go fullscreen
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// create our custom view
GLSurfaceView view = new OpenGLSurfaceView(this);
view.setRenderer((Renderer)view);
setContentView(view);
}
}
我们的新GLSurfaceView也实现了Renderer接口。 onSurfaceCreated和onSurfaceChanged方法与Recipe中的完全相同
5.2;大多数更改发生在onDrawFrame中,因为我们引入了四个新参数:mXrot和mYrot控制立方体沿x轴和y轴的旋转,mXspeed和mYSpeed存储沿x轴和y轴的旋转速度,轴和y轴。每次用户点击D-pad按钮,我们通过修改这些参数来改变立方体的速度。
例5-7显示了我们新类的完整代码。
实例5-7。 GLSurfaceView实现
class OpenGLSurfaceView extends GLSurfaceView implements Renderer {
private Cube mCube;
private float mXrot;
private float mYrot;
private float mXspeed;
private float mYspeed;
public OpenGLSurfaceView(Context context) {
super(context);
// give focus to the GLSurfaceView
requestFocus();
setFocusableInTouchMode(true);
mCube = new Cube();
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -10.0f);
gl.glRotatef(mXrot, 1.0f, 0.0f, 0.0f);
gl.glRotatef(mYrot, 0.0f, 1.0f, 0.0f);
mCube.draw(gl);
gl.glLoadIdentity();
mXrot += mXspeed;
mYrot += mYspeed;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
mYspeed -= 0.1f;
else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
mYspeed += 0.1f;
else if(keyCode == KeyEvent.KEYCODE_DPAD_UP)
mXspeed -= 0.1f;
else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
mXspeed += 0.1f;
return true;
}
// unchanged
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
GL10.GL_NICEST);
}
// unchanged
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f);
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
}
立方体继承自Recipe 5.2。不要忘记在视图的构造函数中调用requestFocus()和setFocusableInTouchMode(true),否则将不会接收键事件。