8

私は、カードにNestedScrollViewがある左右のスワイプ可能なカードシステム(Tinderなど)を作成しようとしています。目標は、ユーザーが上下にスワイプした場合、NestedScrollViewはスクロールしますが、ユーザーが左右にスワイプした場合、カードはそのスワイプを使用します。Android 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)私はNestedScrollViewとその余白内のタッチにmargin_topを置く

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

は、CardStackが正しくつかむ私の入力と左のカードを移動しますか、 NestedScrollViewは、どこにでもタッチしてドラッグすると、方向に関係なく入力を取得します。

この効果を得るには、どのクラス/ onTouchEventを拡張/オーバーライドする必要がありますか、より簡単なアプローチがありますか?

ありがとうございます!

+0

私も、これを把握しようと考えるとしようとしています... 1)onInterceptTouch親クラスで(記録ステップ多分と派遣?)2)実装NestedChildHelper 2にライブラリを変更する)ItemTouchHelperとRecyclerview ..これまでのかなりタフなもの。 。問題があるのか​​どうかは分かりませんが、私が試している図書館は、劇的なシャッフルとスワイプスタックです。 https://github.com/Meetic/Shuffleとhttps://github.com/flschweiger/SwipeStack – nAndroid

+0

これらのライブラリの1つを使うことは、彼らが多く行っているrecyclerview b/cよりも好ましい方法です。 – nAndroid

+0

私はonInterceptTouchEvent()があなたが探しているメソッドだと思います。 https://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent) –

答えて

0

はい、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. 
    } 
} 
+0

mmeloti - これは機能しませんでしたスワイプスタックがこのライブラリで正常に動作しなかったため – nAndroid

+0

問題はスワイプスタックですか?私はあなたのXMLの問題のように思えるが、コードjavaなしではわからない。問題を追跡することは不可能です。 – mmelotti

+0

mmeloti - スクロールビュー内のスワイプスタックが両方とも動作する場所での状況。 https://github.com/neiljaywarner/TestSwipeStackを参照してください。 – nAndroid

0

私はこのアプリの2つのインターフェースでこれを行います。 GestureDetectorを使用し、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()

アクティビティのdispatchTouchEvent()メソッド内でGestureDetectorを使用すると、イベントを消費したりビューグループまたはビューに正しく伝播できます。

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