Android viewpager嵌套viewpager滑动冲突的解决
2017-12-03 12:27
387 查看
最近在项目中用到viewpager嵌套viewpager,但是就以普通的方式,在Fragment中的viewpager在滑动完之后,就会触发外部的viewpager的滑动,遇到这个问题之后,在网上搜寻,类似的帖子很多,但是有些效果不是很好,但是还是找到一种,今天在这里记录一下.
先看看最后完成的效果,以免耽误大家的时间。
接下来就是解决的方法了。
说到滑动冲突,第一个向导的就是事件传递上做做手脚,所以我们先想想,冲突产生的原因。
在最里面的viewpager滑动到最左或者最右边的时候,外边的viewpager就会拦截滑动事件,从而滑动到下一个item。
既然viewpager走了拦截事件,那就看onIntercepterTouchEvent方法的代码可以知道,在MotionEvent.ACTION_MOVE中会调用
其中有一个canScroll方法,通过他的名字就可以看出,这个方法是用来判断控件的子控件是否可以滑动,
用递归的方式找到底层的View,通过判断子viewpager在滑动到最左或最右时,canScroll方法会饭后false,导致最后的结果为ViewPager拦截了事件.
同时,这个子视图不单是viewpager,也可以是其他可滑动的控件例如Recyclerview。
在本案例中,解决的方法是自定义外部的viewpager。
如果大兄弟你嵌套的是recyclerview,也可以这么写。
自己测试过了,复制可以直接使用。
先看看最后完成的效果,以免耽误大家的时间。
接下来就是解决的方法了。
说到滑动冲突,第一个向导的就是事件传递上做做手脚,所以我们先想想,冲突产生的原因。
在最里面的viewpager滑动到最左或者最右边的时候,外边的viewpager就会拦截滑动事件,从而滑动到下一个item。
既然viewpager走了拦截事件,那就看onIntercepterTouchEvent方法的代码可以知道,在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; }
其中有一个canScroll方法,通过他的名字就可以看出,这个方法是用来判断控件的子控件是否可以滑动,
/** * Tests scrollability within child views of v given a delta of dx. * * @param v View to test for horizontal scrollability * @param checkV Whether the view v passed should itself be checked for scrollability (true), * or just its children (false). * @param dx Delta scrolled in pixels * @param x X coordinate of the active touch point * @param y Y coordinate of the active touch point * @return true if child views of v can be scrolled by delta of dx. */ 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); }
用递归的方式找到底层的View,通过判断子viewpager在滑动到最左或最右时,canScroll方法会饭后false,导致最后的结果为ViewPager拦截了事件.
同时,这个子视图不单是viewpager,也可以是其他可滑动的控件例如Recyclerview。
在本案例中,解决的方法是自定义外部的viewpager。
public class ParentViewPager extends ViewPager { public ParentViewPager(Context context) { super(context); } public ParentViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { //解决关键在这里 if (v != this && v instanceof ViewPager) { return true; } return super.canScroll(v, checkV, dx, x, y); } }
如果大兄弟你嵌套的是recyclerview,也可以这么写。
@Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { return super.canScroll(v, checkV, dx, x, y)||(v instanceof RecyclerView)||(v instanceof ViewPager); }
自己测试过了,复制可以直接使用。
相关文章推荐
- Android解决ViewPager嵌套Fragment,Fragment嵌套ViewPager滑动冲突
- Android ViewPager嵌套ViewPager滑动冲突的解决方法
- Android ViewPager嵌套ViewPager滑动冲突的解决方法
- Android ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题解决方案
- Android Listview嵌套viewpager 滑动冲突解决
- Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法
- Android中解决ListView嵌套Viewpager时,滑动事件冲突的方法
- Android中解决ListView嵌套Viewpager时,滑动事件冲突的方法
- Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法
- 完美解决Android里面scrollview嵌套及listview嵌套viewpager的滑动冲突问题的简单方法
- 【Android】完美解决SwipeRefreshLayout中嵌套ViewPager时滑动冲突的方法
- Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
- Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法
- ViewPager,ScrollView 嵌套ViewPager滑动冲突解决
- 解决android中viewpager和内嵌html滑动事件冲突
- Android listview viewpager解决冲突 滑动
- MPAndroidChart在ViewPager+Fragment滑动冲突解决
- (转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决
- Android中RecyclerView嵌套滑动冲突解决的代码片段
- HorizontalScrollView 中嵌套 viewpager滑动冲突的解决