所以我已经有一段时间了,并且无法弄清楚如何在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(滑动卡座)滑动。问题是滑动动作不是从任何方向开始的。