2013-08-03 3 views
3

Я разрабатываю приложение, которое должно обнаруживать общие (двойной кран, fling и т. Д.) И пользовательские жесты (круг). Для достижения этой цели я использую GestureOverlayView, как вы можете увидеть в моем коде:GestureOverlayView перехватывает общие жесты, как этого избежать?

private GestureDetectorCompat mGestureDetector; 
private GestureLibrary mGestureLibrary; 

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.main); 

    mGestureDetector = new GestureDetectorCompat(this, mGestureListener); 
    mGestureLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 

    if (!mGestureLibrary.load()) { 
     Log.e(TAG, "unable to load the custom gestures");  
     finish(); 
    } 

    GestureOverlayView gestureOverlay = (GestureOverlayView) findViewById(R.id.gestures_overlay); 
    gestureOverlay.addOnGesturePerformedListener(mGesturePerformedListener); 
} 

private final SimpleOnGestureListener mGestureListener = new SimpleOnGestureListener(){ 
    public boolean onDoubleTap(MotionEvent event) { 
     // DO STUFF    
     return true;   
    } 
}; 


private final OnGesturePerformedListener mGesturePerformedListener = new OnGesturePerformedListener() { 
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { 
     // DO MORE STUFF 
    }  
}; 


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

и макет:

<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/frame" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<SurfaceView android:id="@+id/camera_preview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

<android.gesture.GestureOverlayView 
    android:id="@+id/gestures_overlay" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gestureColor="#00000000" 
    android:uncertainGestureColor="#00000000" 
    android:gestureStrokeType="multiple" 
    android:eventsInterceptionEnabled="false"/> 

</FrameLayout> 

У меня нет никаких проблем с определением пользовательских жестов, но выглядит GestureOverlayView является перехватывая события, поэтому метод onTouchEvent не достигается, и материал, связанный с двойным нажатием, никогда не выполняется.

Я установил атрибут eventsInterceptionEnabled в false в конфигурации GestureOverlayView, но код все еще не работает.

Любые идеи?

+1

Это может вам помочь. http://stackoverflow.com/questions/13195514/gestureoverlayview-is-blocking-touch-events/29161187#29161187 – akashzincle

+0

@akashzincle Этот удаленный ответ действительно помог мне. Спасибо –

ответ

2

Согласно Android Документы onTouchEvent:

Вызывается, когда сенсорный экран события не было обработаны любым из видов под ним. Это наиболее полезно для обработки событий касания, которые происходят вне границ вашего окна, где нет представления для его получения.

Так, чтобы исключить onTouchEvent как способ захвата двойного крана без дальнейшей модификации. Однако вы можете изменить способ, с помощью которого Activity обрабатывает события касания, чтобы гарантировать, что ваш GestureDetector работает так, как вы ожидаете. Добавьте следующий способ:

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

    return super.dispatchTouchEvent(e); 
} 
+0

Woah, он работал как шарм. Большое спасибо. – jorgepr