Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何检测查看寻呼机垂直滑动并将该事件发送到下面的布局?_Android - Fatal编程技术网

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...
                    }
                }
            }

}