目前viewPager需要的场景是,在pager的两个页面各自使用腾讯地图和高德地图,来验证两家地图的兼容性。因为viewPager没有提供禁止左右滑动的api接口,所以需要自己做处理,否则pager里的地图页面不能拖动。
实现 在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拦截了但不处理,则自己再处理 } }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; }本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理
