2011-02-08 3 views
9

Итак, я хотел бы иметь возможность распознавать продвинутые жесты с помощью GestureOverlayView и OnGestureListener, а также иметь возможность обнаруживать двойные нажатия и длинные нажатия, используя GestureDetector. У меня есть две функции, отлично работающие в двух разных проектах. Тем не менее, я пытаюсь объединить их, и я сталкиваюсь с некоторыми проблемами. Кажется, что, когда я пытаюсь дважды нажать/долгое нажатие, оно не распознается, потому что GestureOverlayView покрывает весь экран и будет распознавать только продвинутые жесты, определенные в Gesture Builder. Кто-нибудь знает, как настроить GestureOverlayView, чтобы он позволял GestureDetector выполнять свою работу? Мой код:GestureOverlayView и Double-Tap

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

Я сделал это, но не уверен, что мое решение будет работать на вас. Вам нужно определить двойное нажатие и нажатие на всю активность или только в вашем списке?

В моем проекте, что у меня есть, конечно, 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 будет распространяться событием прикосновения к внутреннему виду, пока жест не обнаружен. Это решение создает сенсорный список, который вам нужен, чтобы обнаружить простые жесты, используя GestureDetector для метода прослушивателя onTouch. Надеюсь, это может вам помочь.

+0

Это действительно сработало. Спасибо ! –

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, но я вызываю onTouchEvent() с моим экземпляром GestureDetector.

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) 
{ 
    this.myGestureDetector.onTouchEvent(ev); 
    return super.dispatchTouchEvent(ev); 
} 
Смежные вопросы