Android-滑动冲突解决方案

假如ScrollView中嵌套一个ViewPager,
那么,在手势操作时会发现,ViewPager的左右滚动有时会失效,因为它的上级是一个可以上下滚动的ScrollView
这种情况我们称之为:滑动冲突
解法方案有二,一是外部拦截法,二是内部拦截法。

推荐使用外部拦截!内部拦截的灵敏度貌似不如外部拦截!

以下代码仅为模板,具体的拦截我略去了,读者可自行添加。


外部拦截法

package com.che.carcheck.ui.home;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

/**
 * 外部拦截法
 * <p>
 * 案例:ScrollView嵌套ViewPager
 * <p>
 * 作者:余天然 on 16/5/8 下午5:17
 */
public class OuterScrollView extends ScrollView {

    public OuterScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean isIntercept = false;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                isIntercept = false;
                break;
            case MotionEvent.ACTION_MOVE:
                isIntercept = canOuterIntercept(ev);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                isIntercept = false;
                break;
        }
        return isIntercept;
    }

    /**
     * 自定义外部拦截手势的逻辑
     *
     * @param ev
     * @return
     */
    private boolean canOuterIntercept(MotionEvent ev) {
        return false;
    }
}

内部拦截法

package com.che.carcheck.ui.home;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * 内部拦截法
 * <p>
 * 案例:ScrollView嵌套ViewPager
 * <p>
 * 作者:余天然 on 16/5/8 下午5:27
 */
public class InnerViewPager extends ViewPager {
    public InnerViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                if(canInnerIntercept(ev)){
                    //通知上级不要拦截手势
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 自定义内部拦截手势的逻辑
     *
     * @param ev
     * @return
     */
    private boolean canInnerIntercept(MotionEvent ev) {
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值