2013-02-02 31 views
0

我正在創建一個簡單的OpenGL「應用程序」來旋轉三角形。我希望在第一次觸摸時保存觸摸位置對應的角度。然後,在運動時,將形狀旋轉對應於當前位置的角度減去第一次觸摸的角度。ACTION_DOWN的行爲像ACTION_MOVE

這是我的理解,第一步應該在MotionEvent.ACTION_DOWN,第二步在MotionEvent.ACTION_MOVE。但是,在運動過程中似乎正在調用ACTION_DOWN。也就是說,下面的代碼將導致形狀旋轉的手指拖動(我理解,這隻會旋轉到初始觸摸的位置):

private double mTheta;  

@Override 
public boolean onTouchEvent(MotionEvent e) { 

    super.onTouchEvent(e); 

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

    switch (e.getAction()) { 

    case MotionEvent.ACTION_DOWN: 
     x -= getWidth()/2; 
     y -= getHeight()/2; 
     mTheta = Math.atan2(-x,-y) * 180.0f/Math.PI; 
     GL20Renderer.mAngle = (float) mTheta; 
     requestRender(); 
    } 
    return true; 
} 

是我的代碼錯了,或者這模擬器的怪異行爲? (我目前沒有訪問Android設備。)

(附錄:我原來試圖完全實現上述,用MotionEvent.ACTION_MOVE的情況來計算新的角度和渲染。ACTION_DOWN的情況只是保存起始這是行不通的,因爲形狀沒有旋轉 - 因爲偏移角度在移動過程中被重新計算 - 這是我在這一點上的結果。)

+0

我只看到ACTION_DOWN。提到的ACTION_MOVE在哪裏?你實際上只在ACTION_DOWN中做了一些事情,ACTION_MOVE – WarrenFaith

+0

我曾經擁有它(見附錄),但沒有任何東西(除了保存這些座標)。我的問題是,ACTION_DOWN正在連續使用的過程中,它應該只是一次,在第一次觸摸(我認爲?) – Sam

+1

您嘗試過'getActionMasked()'嗎?執行所有ACTION_UP/DOWN/MOVE並記錄它們以查看MOVE和/或UP是否被正確調用。 – WarrenFaith

回答

0

需要使用getActionMasked()而不是getAction()。請參閱WarrenFaith的評論。

0

它可能是你忘了在你的開關/箱子裏放一個斷言。因此,一旦ACTION_MOVE完成,ACTION_DOWN緊隨其後

+0

我其實嘗試過,但沒有幫助。解決方案和沃倫的評論一樣。謝謝。 – Sam