傳送門 ☞ 輪子的專欄 ☞ 轉載請註明 ☞ http://blog.csdn.net/leverage_1229
使物體依據程序的設定而移動,比如旋轉三角形,這對於吸引用戶的眼球是極其有效的。你想讓OpenGL ES圖形與用戶交互嗎?使用OpenGL ES應用響應觸摸的關鍵是擴展你的GLSurfaceView代碼,覆寫其onTouchEvent()方法來監聽觸摸事件。
這一節將向你展示如何監聽用戶的觸摸事件,讓用戶旋轉一個OpenGL ES對象。1設置一個觸摸監聽器
爲了使你的OpenGL ES應用能夠響應觸摸事件,必須在你的GLSurfaceView類中覆寫onTouchEvent()方法。下面的示例演示瞭如何監聽MotionEvent.ACTION_MOVE事件和將其轉換爲一個形狀的旋轉角度。@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);
}
2對外暴露旋轉角度
上面的示例代碼需要你向程序中的其它類暴露旋轉角度,所以應該爲你的renderer添加一個public類型成員變量。由於renderer的代碼是運行在主界面之外的其他線程中,因此必須聲明這個變量爲volatile。參照下面的代碼:public class MyGLRenderer implements GLSurfaceView.Renderer {
...
public volatile float mAngle;
}
3應用旋轉
想要繪製對象響應觸摸事件而產生旋轉,應該註釋掉生成旋轉角度的代碼並添加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);
}
當你完成了上述步驟,運行程序,在屏幕上划動手指旋轉三角形,看起來應該像下面這樣:4示例源碼
點我下載源碼 或訪問:http://developer.android.com/training/graphics/opengl/index.html