2011-02-08 63 views
9

因此,我希望能夠使用GestureOverlayView和OnGestureListener識別高級手勢,並且能夠使用GestureDetector檢測雙擊和長按。我有兩個功能在兩個不同的項目中單獨工作。但是,我試圖將它們結合起來,並遇到一些問題。看起來,當我嘗試雙擊/長按時,它不被識別,因爲GestureOverlayView覆蓋了整個屏幕,並且只會識別手勢生成器中定義的高級手勢。有誰知道如何設置GestureOverlayView,以便它可以讓GestureDetector完成它的工作?我的代碼:GestureOverlayView和雙擊

public class HelloAndroid extends Activity implements OnGesturePerformedListener, OnDoubleTapListener, OnGestureListener { 
/** Called when the activity is first created. */ 
private GestureLibrary mLibrary; 
private GestureDetector detector; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
    if (!mLibrary.load()) { 
     finish(); 
    } 

    GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures); 
    gestures.addOnGesturePerformedListener(this); 

    detector = new GestureDetector(this, this);\ 

和XML ...

<?xml version="1.0" encoding="utf-8"?> 

<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/gestures" 
     android:layout_width="fill_parent" 
     android:visibility="invisible" 
     android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    <TextView 
     android:id="@+id/text1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" 
     /> 
    </LinearLayout>  
</android.gesture.GestureOverlayView> 

提前感謝!

回答

3

我做到了,但不確定我的解決方案是否適合您。 您是否需要在整個活動中檢測雙擊和longpress,或者只是在列表中檢測?

在我的項目中,我擁有的是當然包括GestureOverlayView的所有內容,但是我的GestureDetector只在我想要處理這些事件的容器上分配,特別是在具有縮略圖的網格上。

其實,我的姿態探測器是內部的View.OnTouchListener

public class TouchListener implements View.OnTouchListener { 

    Rect rect = new Rect(); 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 
     // We do not use the return value of 
     // mGestureDetector.onTouchEvent because we will not receive 
     // the "up" event if we return false for the "down" event. 
    // false is returned so children views can receive touch event too. 
     return false; 
} 

    private View getViewAt(int x, int y) { 
    // I need to know which thumbnail was selected 
    } 

    GestureDetector gestureDetector = new GestureDetector(new SimpleOnGestureListener() { 
     @Override 
     public void onLongPress(MotionEvent e) {…} 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) {…} 
     @Override 
     public boolean onDoubleTap(MotionEvent e) {...} 

}); 

}

然後,我只是需要這種觸控監聽器分配給我的網格。在你的情況下,它可能會用在你的清單上。

mGrid.setOnTouchListener(new TouchListener()); 

會發生什麼事是,雖然沒有檢測到的姿態GesturOverlayView將傳播觸摸事件內的意見。解決方案是在視圖上創建一個touchlistener,您需要使用偵聽器onTouch方法上的GestureDetector檢測簡單手勢。希望它可以幫助你。

+0

這實際上工作。謝謝 ! – 2015-01-07 23:15:15

0

該問題來自您的活動的方法onTouchEvent(event),因爲該事件被GestureOverlayView攔截,所以未調用該方法。

如果您想在活動中獲取此事件,您可能需要重寫dispatchTouchEvent(event)方法。

在你的情況,此代碼工作:

@Override 
public boolean dispatchTouchEvent(MotionEvent e) 
{ 
    detector.onTouchEvent(e); 

    return super.dispatchTouchEvent(e); 
} 
0

我有同樣的問題。

GestureOverlayView正在攔截onTouchEvent。所以只要設置

android:eventsInterceptionEnabled="false" 

結果應該是這樣的:

<android.gesture.GestureOverlayView 
     android:id="@+id/gestures" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:eventsInterceptionEnabled="false" > 
0

我是有這個問題,一些。 我找到了一個解決方案,但我不知道它爲什麼有效。

我使用dispathTouchEvent方法,但我用我的GestureDetector實例調用onTouchEvent()。

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) 
{ 
    this.myGestureDetector.onTouchEvent(ev); 
    return super.dispatchTouchEvent(ev); 
}