Android 系列 5.3向OpenGL旋轉立方體新增控制元件
阿新 • • 發佈:2019-02-13
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),否則將不會接收鍵事件。