2015-10-06 64 views
-5

我在本網站上的這個培訓教程http://developer.android.com/training/graphics/opengl/touch.html#listener下面。有人向我解釋來自android開發人員網站的代碼

該鏈接顯示瞭如何響應觸摸事件和旋轉三角形的示例。 我的代碼的所有設置和工作的i-只是不明白的代碼這部分:

private final float TOUCH_SCALE_FACTOR = 180.0f/320; 
private float mPreviousX; 
private float mPreviousY; 

@Override 
public boolean onTouchEvent(MotionEvent e) { 
// MotionEvent reports input details from the touch screen 
// and other input controls. In this case, you are only 
// interested in events where the touch position changed. 

float x = e.getX(); 
float y = e.getY(); 

switch (e.getAction()) { 
    case MotionEvent.ACTION_MOVE: 

     float dx = x - mPreviousX; 
     float dy = y - mPreviousY; 

     // reverse direction of rotation above the mid-line 
     if (y > getHeight()/2) { 
      dx = dx * -1 ; 
     } 

     // reverse direction of rotation to left of the mid-line 
     if (x < getWidth()/2) { 
      dy = dy * -1 ; 
     } 

     mRenderer.setAngle(
       mRenderer.getAngle() + 
       ((dx + dy) * TOUCH_SCALE_FACTOR)); 
     requestRender(); 
} 

mPreviousX = x; 
mPreviousY = y; 
return true; 
} 

getAngle和setAngle是那種在mRenderer對象實用方法作爲可以在鏈路中所示的示例中進一步可見。

我需要一個關於這個代碼如何準確計算角度的解釋,它如何將增量dx和dy以及它們作爲一個角度來使用,getHeight和getWidth發生了什麼並不是這些高度和寬度整個屏幕?我希望我已經清楚,謝謝。

+0

我也在尋找解釋:) –

回答

0

雖然這個問題是大規模下投票是不公平的離開了一個非常普遍的openGL的開發問題,就是大多數(幾乎)所有的例子和教程都極爲設計不當產生誤解許多開發商在早期階段,甚至使他們失去希望瞭解它是如何工作的。

其原因是,基本的OpenGL設置需要大量的知識,並在代碼尺寸巨大的。熟練的開發人員會將代碼分解爲多個類,例如着色器,上下文,緩衝區,對象,矩陣等等,但或多或​​少,所有示例或教程都會將所有內容顯示在同一個類/文件中,因爲它更易於瀏覽一個新的開發者。這導致作者將嘗試找到一個最小(行數)的解決方案來解決與您正在閱讀的文章沒有直接關聯的問題。

至於這個例子,你正在使用:我不知道整個例子或它看起來像什麼,但只是看到你發佈它的方法會建議你有一些形狀在中間(一個三角形提到)是旋轉通過拖動屏幕。

你通常會做的是從中心到手指(x-getWidth(), y-getHeight())獲取矢量,然後可以通過諸如atan2f等方法來計算角度,然後將角度設置爲對象。這實際上也是一種較短的方式,但它需要一些數學知識,並且肯定會對代碼本身有一些解釋。

所以不是,作者用了一個很簡單的過程,它通過說垂直或水平拖動對象將通過一定角度旋轉,旋轉方向取決於您拖動屏幕的哪一部分。此外,作者實際上添加了垂直和水平旋轉,最終只是2個值的總和。

我同意這可能是極其混亂,以瞭解在這樣的編碼缺乏經驗的開發人員。如果沒有其他答案,這個答案應該是你可能考慮的所有未來作者的教程和例子。

相關問題