2012-07-23 28 views
1

我想在我的活動中處理一個手勢。要做到這一點,我已經在我的Activity上覆蓋了公共布爾onTouchEvent(MotionEvent MEvent)方法。內容是這樣的:Android - 如何區分第一個指針和第二個指針在onTouchEvent中移動

motionaction = MEvent.getAction(); 

if(motionaction == MotionEvent.ACTION_DOWN) 
{ 
    ... 
    return true; 
} 

if(motionaction == MotionEvent.ACTION_UP) 
{ 
    ... 
    return true; 
} 

if(motionaction == MotionEvent.ACTION_MOVE) 
{ 
    ... 
    return true; 
} 

motionaction = MEvent.getActionMasked(); 

if(motionaction == MotionEvent.ACTION_POINTER_DOWN) 
{ 
    ... 
    return true; 
} 

if(motionaction == MotionEvent.ACTION_POINTER_UP) 
{ 
    ... 
    return true; 
} 

return true; 

手勢它的如下:

-finger1按住屏幕上的位置(實際上,因爲總是有一點動靜)

-finger2上移屏幕。這是我想抓住的運動。

我可以抓住5個動作,但問題是當兩個手指在屏幕上時,ACTION_MOVE抓住第一和第二手指的移動。方法MEvent.getActionIndex()不適用於始終返回0的ACTION_MOVE;我唯一能做的就是保存finger1的位置,並放棄接近那個點的運動。結果它並不完美,在某些時候,手指2的移動使它受到小指的移動「污染」,因爲儘管手指握住它在屏幕上的位置,聽衆感覺到每一個最小的移動。

我該如何改進?

回答

0

這是由您作爲開發人員管理的。當「DOWN」動作發生時,您將不得不創建一些布爾變量來設置(爲true),然後在發生「UP」或「MOVE」動作事件時取消設置(false)。在下面的代碼中,我甚至會在「DOWN」發生時保持座標,並在用戶四處移動時進行調整。

switch (e.Action) //e is a MotionEvent type 
{ 
    case MotionEvent.ACTION_DOWN: 
    {       
     _prevx = e.getX(); 
     _prevy = e.getY(); 
    } 
    break; 
    case MotionEvent.ACTION_MOVE: 
    { 
     _xoffset += e.GetX() - _prevx; 
     _yoffset += e.GetY() - _prevy; 
     Invalidate(); 

     _prevx = e.GetX(); 
     _prevy = e.GetY(); 
    } 
    break; 
} 

如果你想要做的多手指拖動,你需要實現ScaleGestureDetector.OnScaleGestureListener(http://developer.android.com/reference/android/view/ScaleGestureDetector.OnScaleGestureListener.html)

1

參考Quintin Balsdon的回答

我在我的代碼中有類似的東西。我將finger1的位置保存在ACTION_DOWN的情況下,然後當finger2移動時,我看到移動的Y座標是否超過了保存的finger1 Y座標。如果是的話,那麼它被稱爲finger2的移動被稱爲finger1,並且我在兩個finger模式中丟棄它。

如果我嘗試借鑑我認爲一個圈一個手指模式我有這樣的事情: http://img208.imageshack.us/img208/8113/onefingercircle.jpg

如果我嘗試借鑑我的看法了一圈兩個手指模式我有類似這個: http://img256.imageshack.us/img256/6778/twofingercircle.jpg

所以在一個手指模式下,它完美的工作,但不是在兩個手指模式。 我不知道它是否與手機多點觸控處理器或觸摸屏有關。它可能只與硬件有關,也可能是我對API的誤解。

相關問題