MotionEvent.ACTION_MOVE 在onTouchEvent返回false情况下事件仍然上传
澳门博彩导航网址
澳门博彩导航网址
当前位置 : 澳门博彩导航网址 > 网上赌博新址

MotionEvent.ACTION_MOVE 在onTouchEvent返回false情况下事件仍然上传

viewpage里面放了一个imageview,MotionEvent.ACTION_MOVE里面设置imageview随着手指滑动,onTouchEvent是返回了true。纵向滑动没有问题,横向滑动会出现滑动一点点距离就划不动了,viewpage开始滑动。这是什么情况的。viewpage是横向的。

因为ViewPager.onInterceptTouchEvent在一般情况下会拦截横向的滑动, 所以你的图片收不到MotionEvent.ACTION_MOVE动作.

解决思路大致为:
ViewPager.onInterceptTouchEventMotionEvent.ACTION_MOVE下有一下代码可以不拦截横向滑动

if dx != 0 && !isGutterDragmLastMotionX, dx &&
                        canScrollthis, false, int dx, int x, int y {
                    // Nested view has scrollable area under this point. Let it be handled there.
                    mLastMotionX = x;
                    mLastMotionY = y;
                    mIsUnableToDrag = true;
                    return false;
                }

只要你能执行这段代码, ViewPager就不会拦截这次的横向滑动, 关键的方法应该是canScroll

源码如下

protected boolean canScrollView v, boolean checkV, int dx, int x, int y {
        if v instanceof ViewGroup {
            final ViewGroup group = ViewGroup v;
            final int scrollX = v.getScrollX;
            final int scrollY = v.getScrollY;
            final int count = group.getChildCount;
            // Count backwards - let topmost views consume scroll distance first.
            for int i = count - 1; i >= 0; i-- {
                // TODO: Add versioned support here for transformed views.
                // This will not work for transformed views in Honeycomb+
                final View child = group.getChildAti;
                if x + scrollX >= child.getLeft && x + scrollX < child.getRight &&
                        y + scrollY >= child.getTop && y + scrollY < child.getBottom &&
                        canScrollchild, true, dx, x + scrollX - child.getLeft,
                                y + scrollY - child.getTop {
                    return true;
                }
            }
        }

        return checkV && ViewCompat.canScrollHorizontallyv, -dx;
    }

大致就是判断里面的子控件是否可以横向滑动
因为你里面最后是一个ImageView, 所以最后关键就是
ViewCompat.canScrollHorizontallyv, -dx;当v时ImageView的时候要返回true

如果你使用的版本较高的话, 实际执行的就是ImageView.canScrollHorizontally方法, 这里面的代码很简单, 就不贴出来了, 这个方法直接继承了View.canScrollHorizontally, 返回的是false, 所以解决方案想到2个

  1. 用一个可以滑动的控件作为ImageView的父控件

  2. 重写ImageView.canScrollHorizontally, 令到它返回true
    推荐方法1

上面的分析没有写代码验证, 可能有错, 欢迎指正

1

down的时候禁用viewpage的滚动,up的时候再开启,这样解决了。

xuanxin · 2016年10月11日

添加评论

栏目列表

广告位

澳门博彩导航网址