2011-07-06 302 views
1

我正在創建一個視圖,需要消耗幾乎任何手勢。爲此,我創建了一個ScaleGestureDetector和一個GestureDetector。我還創建了一個監聽器類,並意識到可以實現我需要的每個接口;所以我做了。這使得總的意義OnGestureListener和OnDoubleTapListener,因爲它們來自同一類,但:一個OnGestureListener對象可以處理兩個GestureDetector對象嗎?

  • 請問ScaleGestureDetector想到自己的監聽器類?
  • 如果它對同一個班級感到滿意,它會期待它自己的對象嗎?
  • 相反,我是否需要在兩個探測器上使用相同的監聽器?

實驗已經確認以下內容:

  • 你的確可以使用一個監聽器類,但如果他們消耗相同的事件
  • ScaleGestureDetector和GestureDetector可惹惱對方。然而
  • 看來你可以總是先打電話規模探測器,然後運行常規檢測前檢查其isInProgress()方法阻止這種相互irking:

    public boolean onTouchEvent(MotionEvent event) { 
    //let the ScaleGestureDetector try first 
        mScaleDetector.onTouchEvent(event); 
    //if isInProgress() returns true then it's consuming the event 
        if(mScaleDetector.isInProgress()) return true; 
    //if isInProgress() returns false it isn't consuming the event 
    //it's therefore safe to pass it to the regular detector 
        mPrimaryDetector.onTouchEvent(event); 
        return true; 
    } 
    

回答

2

ScaleGestureDetector和GestureDetector能如果他們 消耗相同的事件互相惹惱。不過看來你可以總是先打電話規模探測器,然後運行定期檢測

個人之前檢查 其isInProgress()方法阻止這種相互 irking,我沒有讓他們兩個手柄發現的所有問題相同的觸摸事件。

該android GestureDetector有一個constructor這需要一個布爾ignoreMultiTouch。將ignoreMultiTouch設置爲true將確保GestureDetector觸摸事件處理忽略任何mutitouch事件。 (安卓實際上是設置ignoreMultiTouchtrue如果目標API等級> = Froyo的,所以你可能不會需要明確設置它。)

如果你只叫mPrimaryDetector.onTouchEvent(event),當mScaleDetector.isInProgress()返回false,你會不正確地得到長按活動。原因是GestureDetector在其onTouchEvent(MotionEvent ev)下面的代碼,以確保它不會與多點觸控手勢衝突:

case MotionEvent.ACTION_POINTER_DOWN: 
    if (mIgnoreMultitouch) { 
    // Multitouch event - abort. 
    cancel(); 
    } 
    break; 

cancel()會做什麼它說,並取消任何單點觸摸手勢。 (如果你真的好奇,你可以自己看看GestureDetector code;它實際上使用處理程序來發送/刪除消息)。

希望這可以幫助任何遇到同樣問題的人。

+0

這非常有用,謝謝!我根本不知道「ignoreMultiTouch」。 –

+0

順便說一句,「煩惱」的表現形式是「MotionEvent」被一個監聽器類改變,導致另一個監聽器崩潰。 –

+1

@Noel看起來像ignoreMultiTouch參數已被重命名爲未使用,並像它被命名不再使用。不知道爲什麼。 – Flynn81

0

這對我的偉大工程:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    m_sGestureDetector.onTouchEvent(event); 
    m_GestureDetector.onTouchEvent(event); 
    return true; 
} 
+1

我假設'm_sGestureDetector'是'ScaleGestureDetector'?無論如何,這就像我在我的問題結束時包含的代碼片段,除了我還有'if(mScaleDetector.isInProgress())返回true;'在比例檢測器消耗事件的情況下在檢測器之間。 –

3

要確定是否MotionEvent是一個多點觸摸事件,只需使用MotionEvent.getPointerCount() > 1。所以我認爲下面的代碼會很好用:

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getPointerCount() > 1) { 
     mScaleDetector.onTouchEvent(event); 
    } else { 
     mDetector.onTouchEvent(event); 
    } 
    return true; 
} 
+0

這並不包括如果指針數量發生變化會發生什麼情況:至少必須通過操作進行過濾,多點觸控手勢通常會在稍微不同的時間點指向下。 –

相關問題