8

Próbuję zrobić system kart z ruchomą lewą i prawą stroną (np. Tinder), gdzie na karcie znajduje się NestedScrollView. Chodziło o to, że jeśli użytkownik przesuwałby tylko w górę iw dół, NestedScrollView byłby przewijany, ale jeśli użytkownik przesuwałby w lewo lub w prawo, karta używałaby tego przesunięcia.Przełóż Android NestedScroll Wyświetl poziome przeciągnięcia do rodzica Wyświetl

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="4dp" 
    card_view:cardUseCompatPadding="true"> 

    <android.support.v4.widget.NestedScrollView 
     android:id="@+id/nested_scroll_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:padding="4dp"> 

      <TextView 
       android:id="@+id/text_view" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" /> 

      <android.support.v7.widget.RecyclerView 
       android:id="@+id/recycler" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" /> 

     </LinearLayout> 

    </android.support.v4.widget.NestedScrollView> 

</android.support.v7.widget.CardView> 

(Biblioteka karta używam jest https://github.com/wenchaojiang/AndroidSwipeableCardStack)

compile 'com.github.wenchaojiang:AndroidSwipeableCardStack:0.1.5' 

Kiedy kładę margin_top na NestedScrollView i dotyku w tym marży, CardStack prawidłowo chwyta mój wkład i przesuwa karty w lewo lub w prawo, ale NestedScrollView przechwytuje moje wejście niezależnie od kierunku, jeśli dotknę i przeciągnę gdziekolwiek indziej.

Którą klasę/onTouchEvent powinienem rozszerzać/przesłonić, aby uzyskać ten efekt, czy może istnieje prostsze podejście?

Dzięki!

+0

Ja też próbuję dowiedzieć się tego, biorąc pod uwagę i próbuje ... 1) onInterceptTouch w klasie nadrzędnej (etapy nagrywania a może i wysyłkowe?) 2) modyfikację biblioteki realizowanego NestedChildHelper 2) Recyclerview z ItemTouchHelper .. Do tej pory dość trudne. . Nie wiem, czy to ważne, ale do tej pory biblioteki, które próbuję, to szufelki i swipestack. https://github.com/Meetic/Shuffle and https://github.com/flschweiger/SwipeStack – nAndroid

+0

Używanie jednej z tych bibliotek jest lepsze niż recyclerview b/c, które dużo robią. – nAndroid

+0

Wierzę, że onInterceptTouchEvent() to metoda, której szukasz. Zobacz https://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent) –

Odpowiedz

0

Tak, powinieneś to zrobić poprzez implementację kodu Java CardStack.CardEventListener i ustawienie go jako detektora mCardStack.setListener (yourListener); Jest na etapie readme wewnątrz projektu. Wypróbuj to:

Class YourListener extends CardStack.CardEventListener{ 
    //implement card event interface 
    @Override 
    public boolean swipeEnd(int direction, float distance) { 
     //if "return true" the dismiss animation will be triggered 
     //if false, the card will move back to stack 
     //distance is finger swipe distance in dp 


     return (distance>300)? true : false; 
    } 

    @Override 
    public boolean swipeStart(int direction, float distance) { 

     return true; 
    } 

    @Override 
    public boolean swipeContinue(int direction, float distanceX, float distanceY) { 

     return true; 
    } 

    @Override 
    public void discarded(int id, int direction) { 
     //this callback invoked when dismiss animation is finished. 
    } 

    @Override 
    public void topCardTapped() { 
     //this callback invoked when a top card is tapped by user. 
    } 
} 
+0

mmeloti - to nie zadziałało ponieważ ten swipestack nie działał poprawnie z tym liberem – nAndroid

+0

Problem polega na swipestack? Nie wiem, wydaje się problem w twoim xml, ale bez kodu java. Niemożliwe, aby wyśledzić problem ... – mmelotti

+0

mmeloti - Każda sytuacja w ogóle, gdzie masz swipestack w scrollview, gdzie oboje pracują. zobacz https://github.com/neiljaywarner/TestSwipeStack – nAndroid

0

Robię to dla 2 interfejsów dla mojej aplikacji. Użyj kontroli prędkości poziomej GestureDetector i onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY). Po pewnym przekroczeniu progu lub przechwyceniu zdarzenia dotykowego dla widoków. Możesz sprawdzić, jak przechwytywać lub przekazywać wydarzenia z Touch api.

To jest ogólne rozwiązanie niezależne od ViewGroups lub widoków, których używasz, to działa. Korzystasz z wydarzenia, zanim zostanie ono przekazane do układu lub widoku niestandardowego.

dotykowe Wydarzenia rozchodzi się jak

  1. Activity.dispatchTouchEvent()
  2. ViewGroup.dispatchTouchEvent()
  3. View.dispatchTouchEvent()
  4. View.onTouchEvent()
  5. ViewGroup.onTouchEvent ()
  6. Activity.onTouchEvent()

Jeśli używasz GestureDetector w metodzie dispatchTouchEvent() w ramach aktywności, będziesz w stanie poprawnie wykorzystywać lub propagować wydarzenie w ViewGroups lub Views.

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    gestureDetector.onTouchEvent(event); 
    // Be sure to call the superclass implementation 
    return super.dispatchTouchEvent(event); 
}