ViewPager解决了外部是可滚动View(List或者scrollView) 与内部可滑动View的事件冲突问题

本文介绍了一种自定义的ViewPager组件,该组件能够有效解决外部可滚动视图(如ListView或ScrollView)与内部滑动视图之间的事件冲突问题。通过实现GestureDetector和调整父级视图的滚动状态,确保了内外滑动操作的平滑性和准确性。
摘要由CSDN通过智能技术生成
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.widget.ListView;
import android.widget.ScrollView;

/**
 * 描述:这个ViewPager解决了外部是可滚动View(List或者scrollView)
 * 与内部可滑动View的事件冲突问题

 */
public class InnerViewPager extends ViewPager {

    /**
     * The parent scroll view.
     */
    private ScrollView parentScrollView;

    /**
     * The parent list view.
     */
    private ListView parentListView;

    /**
     * The m gesture detector.
     */
    private GestureDetector mGestureDetector;

    /**
     * 初始化这个内部的ViewPager.
     *
     * @param context the context
     */
    public InnerViewPager(Context context) {
        super(context);
        mGestureDetector = new GestureDetector(new YScrollDetector());
        setFadingEdgeLength(0);
    }

    /**
     * 初始化这个内部的ViewPager.
     *
     * @param context the context
     * @param attrs   the attrs
     */
    public InnerViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(new YScrollDetector());
        setFadingEdgeLength(0);
    }

    /**
     * 描述:拦截事件.
     *
     * @param ev the ev
     * @return true, if successful
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev)
                && mGestureDetector.onTouchEvent(ev);
    }

    /**
     * 设置父级的View.
     *
     * @param flag 父是否滚动开关
     */
    private void setParentScrollAble(boolean flag) {
        if (parentScrollView != null) {
            parentScrollView.requestDisallowInterceptTouchEvent(!flag);
        }

        if (parentListView != null) {
            parentListView.requestDisallowInterceptTouchEvent(!flag);
        }

    }

    /**
     * 如果外层有ScrollView需要设置.
     *
     * @param parentScrollView the new parent scroll view
     */
    public void setParentScrollView(ScrollView parentScrollView) {
        this.parentScrollView = parentScrollView;
    }

    /**
     * 如果外层有ListView需要设置.
     *
     * @param parentListView the new parent scroll view
     */
    public void setParentListView(ListView parentListView) {
        this.parentListView = parentListView;
    }


    /**
     * The Class YScrollDetector.
     */
    class YScrollDetector extends SimpleOnGestureListener {

        /* (non-Javadoc)
         * @see android.view.GestureDetector.SimpleOnGestureListener#onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float)
         */
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {

            if (Math.abs(distanceX) >= Math.abs(distanceY)) {
                //父亲不滑动
                setParentScrollAble(false);
                return true;
            } else {
                setParentScrollAble(true);
            }
            return false;
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值