傳送門 ☞ 輪子的專欄 ☞ 轉載請註明 ☞ http://blog.csdn.net/leverage_1229
html
使物體依據程序的設定而移動,好比旋轉三角形,這對於吸引用戶的眼球是極其有效的。你想讓OpenGL ES圖形與用戶交互嗎?使用OpenGL ES應用響應觸摸的關鍵是擴展你的GLSurfaceView代碼,覆寫其onTouchEvent()方法來監聽觸摸事件。 java
這一節將向你展現如何監聽用戶的觸摸事件,讓用戶旋轉一個OpenGL ES對象。@Override public boolean onTouchEvent(MotionEvent e) { // MotionEvent攜帶從觸摸屏幕而來的輸入細節以及其它輸入控制。 // 此處,你只須要關注觸摸位置的改變便可。 float x = e.getX(); float y = e.getY(); switch (e.getAction()) { case MotionEvent.ACTION_MOVE: float dx = x - mPreviousX; float dy = y - mPreviousY; // 反向旋轉中線以上 if (y > getHeight() / 2) { dx = dx * -1 ; } // 反向旋轉至左中線 if (x < getWidth() / 2) { dy = dy * -1 ; } mRenderer.mAngle += (dx + dy) * TOUCH_SCALE_FACTOR; // = 180.0f / 320 requestRender(); } mPreviousX = x; mPreviousY = y; return true; }請注意,在計算完旋轉角度以後,該方法調用requestRender()來告訴renderer須要渲染幀了。這種作法很高效,由於在沒有發生旋轉時不須要重畫幀。然而,在沒有使用setRenderMode()方法將渲染模式設置爲僅當數據發生改變才重繪以前,是沒法達到高效的。因此應該確保解除在上一節中對該行代碼的棄用:
public MyGLSurfaceView(Context context) { ... // 僅當繪製數據發生變化時渲染視圖 setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); }
public class MyGLRenderer implements GLSurfaceView.Renderer { ... public volatile float mAngle; }
public void onDrawFrame(GL10 gl) { ... // 爲三角形建立一個旋轉 // long time = SystemClock.uptimeMillis() % 4000L; // float angle = 0.090f * ((int) time); Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); // 合併旋轉矩陣到投影和相機視圖矩陣 Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0); // 繪製三角形 mTriangle.draw(mMVPMatrix); }當你完成了上述步驟,運行程序,在屏幕上划動手指旋轉三角形,看起來應該像下面這樣:
點我下載源碼 或訪問:http://developer.android.com/training/graphics/opengl/index.html
android