使用Android OpenGL ES 2.0繪圖之六:響應觸摸事件

傳送門 ☞ 輪子的專欄 ☞ 轉載請註明 ☞ 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章