2017-07-18 91 views
1

因此,我已經在這一段時間了,一直無法弄清楚如何在Android中實現4向滑動識別。我發現不同的鏈接指向不同的解決方案,但沒有一個符合我的要求。Badoo like Swipeable Cards

我想要完成的是獲得像「滑動手勢」的「Badoo」。 Badoo是一個類似Tinder的應用程序。在向上/向下滑動時,用戶的照片會滾動,並且左側/右側卡片會被喜歡/不喜歡。

我希望實現的動畫是左/右卡片遵循設定的左/右路徑,並移動到喜歡/不喜歡。在上/下的圖片對齊到他們的下一個/上一個。

我已經嘗試過無數的圖書館,github上的可刷卡,現在正在嘗試爲我的要求實現自定義視圖。

目前我試圖在CardView中插入VerticalViewPager。這裏的問題是VerticalViewPager攔截所有觸摸事件,因此我無法左右滑動我的卡片。

這是我對CardView項目OnTouch事件:

public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_MOVE: 
     pager.requestDisallowInterceptTouchEvent(true); 
     break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_CANCEL: 
     pager.requestDisallowInterceptTouchEvent(false); 
     break; 
    } 
    return true; 
} 

這就是我想要的目的。這是Badoo上的樣子:

Badoo上截圖1:https://drive.google.com/open?id=0BzGcu10X5GRrTDZHRm4xT0tnQ1k Badoo上截圖2:https://drive.google.com/open?id=0BzGcu10X5GRrc2pvRTZKS2p2UEU

如果有人有類似的四向滑動手勢任何類似的庫都知道,請讓我知道。

編輯:

我做了卡和ViewPager的CardView(cardViewParent)父視圖有一個孩子cardView和cardView的孩子是VerticalViewPager(mViewPager):

cardViewParent.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent event) { 
       Toast.makeText(context, "incardviewPARENT", Toast.LENGTH_SHORT).show(); 

       float rawX = 0, rawY = 0; 

       switch (event.getAction()) { 


        case MotionEvent.ACTION_DOWN: 
         //gesture has begun 
         float x; 
         float y; 
         //cancel any current animations 

         mActivePointerId[0] = event.getPointerId(0); 

         x = event.getX(); 
         y = event.getY(); 
         rawX = event.getRawX(); 
         rawY = event.getRawY(); 


         initialXPress[0] = x; 
         initialYPress[0] = y; 
         initialRawXPress[0] = rawX; 
         initialRawYPress[0] = rawY; 

         break; 

        case MotionEvent.ACTION_MOVE: 
         //gesture is in progress 

         final int pointerIndex = event.findPointerIndex(mActivePointerId[0]); 
         //Log.i("pointer index: " , Integer.toString(pointerIndex)); 
         if (pointerIndex < 0 || pointerIndex > 0) { 
          break; 
         } 

         final float xMove = event.getX(pointerIndex); 
         final float yMove = event.getY(pointerIndex); 
         float rawDY = Math.abs(event.getRawY() - 
         initialRawYPress[0]); 
         float rawDX = Math.abs(event.getRawX() - initialRawXPress[0]); 

         //calculate distance moved 
         final float dx = xMove - initialXPress[0]; 
         final float dy = yMove - initialYPress[0]; 
         Log.d("RAW DY:", "" + rawDY); 

         if(rawDY > 100 && !animationStart[0]) 
         { 
          // vertical swipe detected 
          mViewPager.setSwipeable(true); 
          cardStack.setSWIPE_ENABLED(false); 
          // mViewPager.dispatchTouchEvent(event); 
          return false; 
         } 

         if((rawDY <100 && rawDX > 100) || 
         animationStart[0]) { 

          //horizontal swipe 

          animationStart[0] = true; 
          cardStack.setSWIPE_ENABLED(true); 
          mViewPager.setSwipeable(false); 
          // cardStack.dispatchTouchEvent(event); 
          return false; 

         } 

       } 

       return true; 

      } 
     }); 

如果檢測到向上輕掃動作,則啓用ViewPager的輕掃動作,否則啓用CardStack(輕掃卡座)輕掃動作。問題是滑動並不是從任何方向開始的。

+0

嘿Sabeeh扎伊迪 我面臨同樣的問題,我使用刷卡和實施viewpager指示燈,當我實現viewpager指標刷卡不工作,只是我想用viewpagerindicator像badoo應用一樣實施cardswipe,如何實現這一點,你可以給我留下一個郵件,演示或鏈接。 –

+1

我通過手動調用孩子的OnTouch,當父母中的滑動操作識別出必要的方向時,我可以使用它。我會在一段時間後在這裏發佈代碼。將需要挖掘它。 –

+0

謝謝Sabeeh Zaidi –

回答