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

查看:89
本文介绍了android - MotionEvent.ACTION_MOVE 在onTouchEvent返回false情况下事件仍然上传的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

解决方案

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

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

if (dx != 0 && !isGutterDrag(mLastMotionX, dx) &&
                        canScroll(this, 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 canScroll(View 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.getChildAt(i);
                if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
                        y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
                        canScroll(child, true, dx, x + scrollX - child.getLeft(),
                                y + scrollY - child.getTop())) {
                    return true;
                }
            }
        }

        return checkV && ViewCompat.canScrollHorizontally(v, -dx);
    }

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

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

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

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

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

这篇关于android - MotionEvent.ACTION_MOVE 在onTouchEvent返回false情况下事件仍然上传的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆