将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' 

当我在NestedScrollView上放一个margin_top并在这个空白区域内触摸时,CardStack可以正确地抓住我的input,并且卡片向左或向右移动,但是如果我在其他地方触摸并拖动,NestedScrollView会抓住我的input而不pipe方向如何。

我应该扩展/覆盖哪个类/ onTouchEvent来获得这种效果,或者可能会有一个更简单的方法?

谢谢!

Solutions Collecting From Web of "将Android NestedScrollView水平滑动传递给父视图"

是的,你应该通过在Java代码上实现这个CardStack.CardEventListener,并将其设置为侦听器mCardStack.setListener(yourListener); 这是在项目内的自述。 尝试这个:

 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个接口。 使用GestureDetectoronFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY)检查水平速度。 经过一定的门槛通过或拦截触摸事件的意见。 你可以检查如何拦截或传递触摸API的事件。

这是一个独立于您使用的ViewGroups或Views的通用解决scheme 。 在事件传递到布局或自定义视图之前使用事件。

触摸事件传播为

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

如果在Activity的dispatchTouchEvent()方法中使用GestureDetector ,则可以正确使用或传播事件到ViewGroups或Views。

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