RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
Android中怎么利用ViewPager禁止左右滑动

这篇文章将为大家详细讲解有关Android中怎么利用 ViewPager禁止左右滑动,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

成都创新互联网站建设公司是一家服务多年做网站建设策划设计制作的公司,为广大用户提供了成都做网站、成都网站设计、成都外贸网站建设,成都网站设计,1元广告,成都做网站选成都创新互联,贴合企业需求,高性价比,满足客户不同层次的需求一站式服务欢迎致电。

在viewPager进行事件分发时,自己不拦截事件,将事件交给child消耗。当viewPager接收到事件时,自身的 dispatchTouchEvent 一定会被调用,其结果受自身的 onInterceptTouchEvent 影响,在这里我将 onInterceptTouchEvent -> return false,表示pager本身不拦截事件,事件会传递到child view,同时子view 的 dispatchTouchEvent 会被调用,如果子view 的 dispatchTouchEvent -> return false,可以对应子view onInterceptTouchEvent -> return true 拦截了事件,但是子view onTouchEvent -> return false 并未处理事件这种情况,那么pagers本身的 onTouchEvent 即被调用,来消耗该事件。代码如下:

public class NoScrollVP extends ViewPager {
    public NoScrollVP(Context context) {
        this(context, null);
    }
    public NoScrollVP(Context context,AttributeSet attrs){
        super(context, attrs);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
       return false;// 不拦截事件
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // 与业务需求挂钩
        return true;// 子view拦截了但不处理,则自己再处理
    }}1234567891011121314151617
pager源码

在这个问题上,可以参考下pager的源码,当我们pager左右滑动时,pager会进行滑动翻页,当我们上下滑动时,pager不做处理。代码可以参考:

                if (mScrollState == SCROLL_STATE_SETTLING                        && Math.abs(mScroller.getFinalX() - mScroller.getCurrX()) > mCloseEnough) {
                    // Let the user 'catch' the pager as it animates.
                    mScroller.abortAnimation();
                    mPopulatePending = false;
                    populate();
                    mIsBeingDragged = true;
                    requestParentDisallowInterceptTouchEvent(true);
                    setScrollState(SCROLL_STATE_DRAGGING);
                } else {
                    completeScroll(false);
                    mIsBeingDragged = false;
                }12345678910111213

这是在pager的 onInterceptTouchEvent 方法中调用的,mIsBeingDragged 参数很关键,这是 onInterceptTouchEvent 方法的返回值。当我们在滑动结束 up 时候,如果滚动 ✖️偏移量的绝对距离 > mCloseEnough,那么pager会自己拦截掉事件,反之,则往下传递下去。其中mCloseEnough = 2dp * 屏幕密度(160dpi屏幕,密度为1;120dpi屏幕,密度0.75,可依此类推)。当然pager的实际处理逻辑要复杂的多,例如在move的时候,是否需要拦截事件也做了一系列判断,但是事件的分发思想都是一样的。

关于Android中怎么利用 ViewPager禁止左右滑动就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


当前标题:Android中怎么利用ViewPager禁止左右滑动
当前链接:http://scpingwu.com/article/iijhpc.html