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는 다른 곳을 터치하고 드래그하면 방향에 관계없이 입력을 가져옵니다.

이 효과를 위해 어떤 class/onTouchEvent를 확장/재정의해야합니까? 아니면 더 간단한 방법이 있을까요?

감사합니다.

+0

나도이 문제를 알아 내려고 생각하고 노력하고 ... 1) onInterceptTouch 부모 클래스 (기록 단계 어쩌면 및 파견?) 2) 구현 NestedChildHelper 2 라이브러리를 수정) ItemTouchHelper와 Recyclerview .. 지금까지 꽤 어려운 사람. . 문제가되는지는 확실하지 않지만, 지금까지 제가 시도하고있는 도서관은 격렬한 혼란과 swipestack입니다. https://github.com/Meetic/Shuffle 및 https://github.com/flschweiger/SwipeStack – nAndroid

+0

라이브러리 중 하나를 사용하는 것이 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)로 설정해야합니다. 프로젝트 내부의 추가 정보입니다. 이것을 시도하십시오 :

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 - 작동하지 않았습니다. swipestack이이 라이브러리에서 제대로 작동하지 않았기 때문에 – nAndroid

+0

문제는 swipestack입니까? 나도 몰라, 당신의 XML에서 문제처럼 보이지만 코드 자바없이. 문제를 추적하는 것이 불가능합니다 ... – mmelotti

+0

mmeloti - 모두 스크롤바에 swipestack이있는 상황입니다. https://github.com/neiljaywarner/TestSwipeStack을 참조하십시오. – nAndroid

0

내 응용 프로그램의 2 개의 인터페이스에 대해 이렇게합니다. GestureDetector을 사용하고 onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY)에서 수평 속도를 확인하십시오. 특정 임계 값이 지나간 후에 뷰에 대한 터치 이벤트를 전달하거나 가로 채기. Touch API에서 이벤트를 가로 채거나 전달하는 방법을 확인할 수 있습니다.

이 방법은 어떤 뷰 그룹이나 뷰를 사용하든 상관없이 일반적인 해결책으로을 사용합니다. 레이아웃이나 사용자 정의보기로 전달되기 전에 이벤트를 소비합니다.

터치 이벤트는 전파

  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); 
}