2013-03-09 47 views
4

在我的Android應用程序中,我有一個ImageView,我希望用戶能夠左/右/上/下將圖像(靜態地圖)更改爲相鄰的地圖。但是另外,我想要捏縮放能力和地圖本身。使用ScaleGestureDetector和GestureDetector?

我可以得到扔掉或捏縮放工作,但不能在一起。我使用GestureDetector(與SimpleOnGestureListener)的投擲。我使用ScaleGestureDetector(來自Making Sense of Multitouch)進行縮放。

難點在於確定觸摸動作時調用哪個手勢監聽器。這不是一個編碼問題,而是邏輯問題。只需一個手指觸摸動作,它是一個投擲或縮放?即使使用捏縮放,初始MotionEvent也是ACTION_DOWN。我一直在嘗試使用圖像大小(內在或縮放?)作爲決策點。但使用ACTION_DOWN的初始縮放操作(當圖像大小是內在的,我想縮放它)似乎逃脫了我。

以前有人解決過這個問題嗎?

回答

1

終於找到了鏈路上的答案: http://code.google.com/p/android/issues/detail?id=42591

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    boolean result = mScaleGestureDetector.onTouchEvent(event); 

    // result is always true here, so I need another way to check for a detected scaling gesture 
    boolean isScaling = result = mScaleGestureDetector.isInProgress(); 
    if (!isScaling) { 
     // if no scaling is performed check for other gestures (fling, long tab, etc.) 
     result = mCommonGestureDetector.onTouchEvent(event); 
    } 

    // some irrelevant checks... 

    return result ? result : super.onTouchEvent(event); 
} 
+0

好主意,但沒有真正發揮作用。看到我的回答 – yonix 2017-11-07 22:20:20

5

你可以傳給兼備的姿態探測器的事件。

檢查http://developer.android.com/training/gestures/scale.html下「更多複雜的縮放例子」:

public boolean onTouchEvent(MotionEvent event) { 
    boolean retVal = mScaleGestureDetector.onTouchEvent(event); 
    retVal = mGestureDetector.onTouchEvent(event) || retVal; 
    return retVal || super.onTouchEvent(event); 
} 

當然給拉塔塔特被引用的bug,super.onTouchEvent永遠不會在上面的例子中被稱爲,這可能會或可能不會被罰款,取決於你的用例。

+1

我試過這個和Ratatat的回答,這個給了我更好的結果。在處理同時平移和縮放時,如果您使用此答案,則只需處理onScroll回調和縮放onScale中的任何平移,而不是嘗試基於縮放操作的focusX/focusY中的移動進行平移。 – 2015-01-07 22:39:09

0

Ratatat's answer的想法是好的,但即使我們不想滾動,我們也應該將事件傳遞給gestureDetector,否則它會被搞亂。

我結束了這樣的事情:

scaleDetector = new ScaleGestureDetector(...); 

gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     if (scaleDetector.isInProgress()) { 
      // don't allow scrolling while scaling 
      return false; 
     } 

     // handle scrolling 

     return true; 
    } 
} 

然後onTouchEvent的實現應該像aij's answer

boolean result = scaleDetector.onTouchEvent(event); 
result = gestureDetector.onTouchEvent(event) || result; 
return result || super.onTouchEvent(event); 
相關問題