Передача горизонтальных прокруток Android NestedScrollView в родительский вид

Я пытаюсь сделать левую правую систему карточных карт (например, Tinder), где на карте есть NestedScrollView. Цель заключалась бы в том, что если пользователь прокручивал вверх и вниз только, NestedScrollView прокручивал бы, но если бы пользователь промахнулся влево или вправо, карта использовала бы это.

<?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> 

(Я использую библиотеку карт https://github.com/wenchaojiang/AndroidSwipeableCardStack )

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

Когда я помещаю margin_top в NestedScrollView и касаюсь этого поля, CardStack правильно берет мой вход, и карта перемещается влево или вправо, но NestedScrollView захватывает мой вход независимо от направления, если я касаюсь и перетаскиваю в другое место.

Какой класс / onTouchEvent следует расширять / переопределять, чтобы иметь этот эффект, или может быть более простой подход?

Благодаря!

Solutions Collecting From Web of "Передача горизонтальных прокруток Android NestedScrollView в родительский вид"

Да, вы должны сделать это, выполнив на Java код CardStack.CardEventListener и установите его как слушатель mCardStack.setListener (yourListener); Он находится в режиме readme внутри проекта. Попробуй это:

 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. } } 

Я делаю это для 2-х интерфейсов для моего приложения. Используйте GestureDetector и on on onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) проверьте горизонтальную скорость. После определенного порогового значения пропускается или перехватывает событие касания для просмотров. Вы можете проверить, как перехватывать или передавать события из Touch api.

Это общее решение, независимо от того, какие ViewGroups или Views вы используете , он работает. Вы потребляете событие до его передачи в макет или пользовательский вид.

Сенсорные события распространяются как

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

Если вы используете GestureDetector в методе dispatchTouchEvent () вашей активности, вы сможете правильно использовать или просматривать события в ViewGroups или Views.

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