2013-06-08 13 views

Odpowiedz

17

Podklasa, przesuń onInterceptTouchEvent() i spraw, aby zawsze zwracała false. Zapobiegnie to obsłudze zdarzeń dotykowych przez SlidingPaneLayout.

Aby uzyskać więcej informacji, zobacz http://developer.android.com/training/gestures/viewgroup.html.

Aktualizacja:
Jeśli zdarzenia dotykowe nie są obsługiwane przez widoku (ów) dziecka, SlidingPaneLayout „s onTouchEvent() metoda zostanie wywołana mimo wszystko. Aby całkowicie wyłączyć obsługę zdarzeń dotykowych, należy również zastąpić onTouchEvent() i zawsze zwracać false.

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    return false; 
} 

Uwaga: Wadą tego podejścia jest to, że zdarzenia dotykowe wciąż wysyłane do drugiego widzenia dziecka, kiedy jest tylko częściowo widoczne. Więc możesz sprawdzić inne odpowiedzi.

+0

Myślę, że powinien zwrócić wartość true, ale nie false. – GMsoF

+0

@GMsoF powinien zwrócić wartość false. – Zeba

+0

Jeśli ** onInterceptTouchEvent() ** zwraca wartość false, ** onTouchEvent() ** nie zostanie wywołane. Według twojego linku. Ale nie przetestowałem tego. Problemem tego podejścia (o ile wiem) jest to, że gdy lewe okienko jest otwarte, można je zamknąć tylko przez naciśnięcie klawisza powrotu. Myślę, że rozwiązanie ** quicksilver ** jest właściwą odpowiedzią – Arash

9

Ten jest nieco skomplikowany. Jeśli zawsze zwrócisz wartość true w onInterceptTouchEvent(), spowoduje to wysłanie zdarzenia do ukrytej treści poniżej. Udało mi się to osiągnąć w następujący sposób:

+0

zadziałało dla mnie .. Wybrane. –

+0

Dobra odpowiedź. Bez zwracania fałszu w onTouchEvent Możesz nadal otwierać menu klikając na krawędź ekranu. –

+0

Ten kod wywołuje tylko TouchEvents w prawym okienku (drugie dziecko). Jeśli chcesz, aby oba panele pozostały interaktywne, użyj czegoś takiego w TouchEvent: 'if (! GetChildAt (0) .dispatchTouchEvent (ev)) getChildAt (1) .dispatchTouchEvent (ev);'. Przesyła się do prawego panelu, jeśli lewy nie obsługuje zdarzenia. – random6174

1

W oparciu o odpowiedź Roman Zhilichs z dwoma ulepszeniami.

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return !swipeEnabled || super.onInterceptTouchEvent(ev); 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (!swipeEnabled) { 
     if (!getChildAt(0).dispatchTouchEvent(ev)) { 
      ev.offsetLocation(-getChildAt(0).getWidth(),0); 
      getChildAt(1).dispatchTouchEvent(ev); 
     } 
     return true; 
    } 
    return super.onTouchEvent(ev); 
} 

Najpierw próbuje wysłać MotionEvent do pierwszego dziecka przed wysłaniem go do drugiego. W ten sposób oba widoki podrzędne pozostają interaktywne. Po drugie, ruchy programu MotionsEvent wysyłane do drugiego widoku podrzędnego muszą być przesunięte o szerokość pierwszego widoku. Zakłada się, że przesuwna szyba przesuwa się z lewej strony, jak zwykle w przypadku SlidingPaneLayout.

4

Jeśli chcesz wyłączyć „przeciągnij, aby otworzyć” imprezę i umożliwić wejście użytkownika, gdy układ jest otwarty, można użyć tej

@Override 
public boolean onInterceptTouchEvent(MotionEvent arg0) { 

    if(!isOpen()) return false; 

    return super.onInterceptTouchEvent(arg0); 
} 
+0

doskonała odpowiedź – risefire

+0

działa idealnie .. !! – Bhavana

0

Jeśli ustawisz touchlistener i powrócić prawda, to zużywają zdarzenie dotyku i widżet nie będzie go obsługiwał dalej.

slidingPaneLayout.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     return true; 
    } 
}); 
Powiązane problemy