0

所以我在这方面已经有一段时间了,一直无法弄清楚如何在 android 中实现 4 向滑动识别。我发现不同的链接指向不同的解决方案,但没有一个能满足我的要求。

我希望完成的是获得类似“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

如果有人知道任何具有类似 4 向滑动手势的类似库,请告诉我。

编辑:

我已经为卡片和 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 的(滑动面板)滑动。问题是滑动动作不会从任何方向开始。

4

0 回答 0