Android 如何检测查看寻呼机垂直滑动并将该事件发送到下面的布局?
我有一个Android 如何检测查看寻呼机垂直滑动并将该事件发送到下面的布局?,android,Android,我有一个视图,它有一些垂直的手势,比如向下滑动以向下移动视图等。我们将此视图称为根视图。一切都很好,我需要在上面添加一个查看页面。现在,ViewPager正在消耗所有触摸事件。ViewPager应该水平滚动,但也使用垂直滑动,什么也不做(不将事件传递给rootView)。如何使两个视图都能听到它们相应的触摸事件,并将其余的发送给其他视图。我尝试创建一个CustomViewPager并覆盖它的onTouchEvent,希望首先识别向下滑动,然后在这种情况下返回false,以便rootview有机会
视图
,它有一些垂直的手势
,比如向下滑动以向下移动视图等。我们将此视图称为根视图
。一切都很好,我需要在上面添加一个查看页面。现在,ViewPager
正在消耗所有触摸事件。ViewPager
应该水平滚动,但也使用垂直滑动,什么也不做(不将事件传递给rootView)。如何使两个视图都能听到它们相应的触摸事件,并将其余的发送给其他视图。我尝试创建一个CustomViewPager并覆盖它的onTouchEvent
,希望首先识别向下滑动,然后在这种情况下返回false
,以便rootview有机会处理该触摸事件。但是在将手势识别为向下/向上的过程中,ViewPager
正在使用ACTION\u down
和ACTION\u MOVE
事件,这是rootView
处理手指移动量所需的事件
我想到的一个解决方案是在ViewPager
上的所有布局上添加onTouchEvent
,它识别垂直与水平,并调用相应的触摸事件(rootView
与ViewPager
),但为了识别上/下/侧手势,布局
将使用一些事件,这些事件可能对根视图
有价值
想到的另一个解决方案是覆盖ViewPager
的ontouchEvent
,并调用rootView的ontouchEvent
,而不考虑向上/向下/侧向移动。通过这种方式,ViewPager
和rootView
都可以使用该事件,但有时会使屏幕波动
我应该如何解决这个问题?我会很感激一些建议,不需要提供代码,只是一个解决这个问题的好方法 您是否尝试过将rootView
放在ViewPager
的顶部
这样,ViewPager
应该仍然可以工作,尽管在rootView
下,我必须完全修改我的原始答案。我的第一个解决方案是子类化ViewPager并覆盖onTouchEvent()
,添加逻辑在CustomViewPager
和它下面的RelativeLayout
之间切换。返回false
表示视图忽略事件,返回super.onTouchEvent(event)
表示视图将使用事件,直到用户抬起手指为止。所有逻辑都在事件的动作
部分,但由于您只有一次机会返回值(这是事件的第一部分,动作_DOWN
),因此您无法使用任何动作来确定是使用还是忽略事件
我最终通过编写一个全新的类来实现它,从ViewPager
代码开始,并添加逻辑来识别垂直手势。当出现垂直手势时,运行代码,该代码作用于其下方的RelativeLayout
,而不是将触摸事件传递给它。下面是我的类的onTouchEvent()
的代码片段
public class CustomViewPager extends ViewGroup {
// code from ViewPager class...
case MotionEvent.ACTION_MOVE:
if (!mIsBeingDragged) {
if (DEBUG) Log.v(TAG, "!mIsBeingDragged");
final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float xDiff = Math.abs(x - mLastMotionX);
final float y = MotionEventCompat.getY(ev, pointerIndex);
final float yDiff = Math.abs(y - mLastMotionY);
if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
if (xDiff > mTouchSlop && xDiff > yDiff) {
isVerticalMovement = false;
hasMovedHorizontally = true;
if (DEBUG) Log.v(TAG, "Starting drag!");
mIsBeingDragged = true;
requestParentDisallowInterceptTouchEvent(true);
mLastMotionX = x - mInitialMotionX > 0 ? mInitialMotionX + mTouchSlop :
mInitialMotionX - mTouchSlop;
mLastMotionY = y;
setScrollState(SCROLL_STATE_DRAGGING);
setScrollingCacheEnabled(true);
// Disallow Parent Intercept, just in case
ViewParent parent = getParent();
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
}
else {
if (yDiff > mTouchSlop) {
// VERTICAL SWIPE -- do stuff here...
}
}
}
}