先上代码
public class ChildViewPager extends ViewPager {
/** 触摸时按下的点 **/
PointF downP = new PointF();
/** 触摸时当前的点 **/
PointF curP = new PointF();
OnSingleTouchListener onSingleTouchListener;
public ChildViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public ChildViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
// 当拦截触摸事件到达此位置的时候,返回true,
// 说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
return true;
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
// 每次进行onTouch事件都记录当前的按下的坐标
float offX, offY;
curP.x = arg0.getX();
curP.y = arg0.getY();
if (arg0.getAction() == MotionEvent.ACTION_DOWN) {
// 记录按下时候的坐标
// 切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
downP.x = arg0.getX();
downP.y = arg0.getY();
// 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
getParent().requestDisallowInterceptTouchEvent(true);
}
if (arg0.getAction() == MotionEvent.ACTION_MOVE) {
// 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
// 判断是左右滑还是上下滑,如果左右滑动-》通知父类不对自己进行干扰,如果上下滑动进行干扰
offX = arg0.getX() - downP.x;
offY = arg0.getY() - downP.y;
if (Math.abs(offX) > Math.abs(offY)) {// 横向滑动,不对事件进行拦截。
// 判断此时是否是最后一页如果是最后一页也通知父类对事件拦截
if (getCurrentItem() == 0) {// 左边或右边,这样就必须设置总共的view的个数
// 在最左边能从左往右滑动
if (offX > 0) {// 从左往右
getParent().requestDisallowInterceptTouchEvent(false);
}
} else if (getChildCount() == (getCurrentItem() + 1)) {
// 在最右边能从右往左滑动
if (offX < 0) {// 从左往右
getParent().requestDisallowInterceptTouchEvent(false);
}
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
System.out.println("set true" + getCurrentItem() + "-"
+ getChildCount() + "");
} else {
getParent().requestDisallowInterceptTouchEvent(false);
}
}
if (arg0.getAction() == MotionEvent.ACTION_UP) {
// 在up时判断是否按下和松手的坐标为一个点
// 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
if (downP.x == curP.x && downP.y == curP.y) {
onSingleTouch();
return true;
}
}
return super.onTouchEvent(arg0);
}
/**
* 单击
*/
public void onSingleTouch() {
if (onSingleTouchListener != null) {
onSingleTouchListener.onSingleTouch();
}
}
/**
* 创建点击事件接口
*
* @author wanpg
*
*/
public interface OnSingleTouchListener {
public void onSingleTouch();
}
public void setOnSingleTouchListener(
OnSingleTouchListener onSingleTouchListener) {
this.onSingleTouchListener = onSingleTouchListener;
}
原来的ChildViewPager是从网上找的,他只解决里层viewpager不被外层viewpager拦截的作用。但在项目中还需要的是滑动到一端继续滑动就要滑动外层的viewpager,此时就要取得viewpager的子view的个数,并判断如果是最右端就内层响应从左向右的手势,把从右向左的手势推给外层,最左端反之。
getChildCount()也可以在viewpager替换成子view的个数,也可以在外面设定:viewPager.setOffscreenPageLimit(4);
分享到:
相关推荐
Android Fragment嵌套ViewPager,ViewPager嵌套多个Fragment,Fragment的多层嵌套。csdn博客讲解地址:http://blog.csdn.net/qq_24956515/article/details/50990506
viewpager嵌套viewpager滑动处理的demo,使用的内部拦截法,外部拦截法很麻烦,推荐使用内部拦截法。viewpager嵌套viewpager滑动处理的demo,使用的内部拦截法,外部拦截法很麻烦,推荐使用内部拦截法。
当ViewPager 嵌套时,子ViewPager,不能优先处理滑动事件。 玩一下 网易新闻 客户端,多层嵌套,处理的很流畅,不过也有点小bug。此Demo完美解决ViewPager嵌套的滑动问题,但快速滑动父ViewPager,再滑动ViewPager...
在Android开发中,`ViewPager`和`GridView`是两种非常重要的视图组件,它们各自有着独特的功能,并且在很多场景下可以结合起来实现丰富的用户界面。`ViewPager`通常用于实现页面的左右滑动,提供平滑的过渡效果,而`...
而当我们在一个ViewPager中再嵌套另一个ViewPager时,就会遇到所谓的"两个ViewPager嵌套问题"。这个问题通常涉及到滚动冲突、内存管理和性能优化等多个方面。下面将详细讲解这个主题。 **一、滚动冲突** 两个...
在“viewpager中嵌套多个activity”的场景下,开发者可能会遇到一些挑战,比如如何有效地管理多个Activity之间的数据加载和通信。在这个主题中,我们将深入探讨如何在ViewPager中实现对多个Activity的嵌套,并进行...
两个ViewPager2嵌套,同一方向无法滑动,可以在子 ViewPager2 外面嵌套一层 NestedScrollableHost.
在Android开发中,`ViewPager`是一个非常常用的组件,它用于展示可以左右滑动的页面,常用于实现Tab切换或者水平滚动的效果。而`Fragment`则是Android应用中的一个模块化组件,它可以包含UI和其他功能,方便在不同的...
当ViewPager 嵌套时,子ViewPager,不能优先处理滑动事件。 玩一下 网易新闻 客户端,多层嵌套,处理的很流畅,不过也有点小bug。此Demo完美解决ViewPager嵌套的滑动问题,但快速滑动父ViewPager,再滑动ViewPager...
在Android开发中,`ViewPager`是一个非常常用的组件,主要用于实现页面滑动效果,常用于创建类似于TabLayout或者轮播图的效果。然而,有时我们需要在`ViewPager`内部再嵌套一个`ViewPager`,来实现更复杂的布局和...
首先,`ViewPager`是Android SDK中的一个组件,它允许用户通过手势在多个全屏视图之间进行平滑的切换。它通常用于构建具有多个页面的应用,如相册、新闻应用等。`ViewPager`的核心在于其适配器,需要自定义一个`...
重写了子viewpager的方法,Childviewpager继承了viewpager。解决了父viewpager不能滑动或者子viewpager不能滑动问题。修改了事件的分发。可以使子viewpager滑动到最后一页后直接滑入父viewpager的fragment。修改子...
自定义viewpager解决scrollview嵌套viewpager不显示和高度自适应
在Android应用开发中,复杂界面的设计常常涉及到组件的嵌套和多布局的使用。本教程将深入探讨如何利用RecyclerView和ViewPager来构建一个高效且可扩展的界面。RecyclerView因其高效的列表展示能力而广受欢迎,而...
多个ViewPager嵌套的滑动冲突的处理,处理方法简单易懂,还标有注释,使用过程中没有bug,希望对大家有帮助吧
2. **处理滚动事件**:在自定义的ViewPager中,我们需要正确处理滑动手势,判断是应该切换页面还是让内部的NestedScrollView滚动。这通常需要对MotionEvent和NestedScrolling事件进行精细的处理。 3. **禁用默认...
在标题“android vierpager+fragment嵌套viewpager+fragment”中,提到了`VierPager`,这可能是作者在描述时的误写,实际上应该是指`ViewPager`。因此,我们主要讨论的是如何在`ViewPager`中嵌套`Fragment`,以及`...
完美解决解决viewpager嵌套viewpager,子viewpager轮播白屏的问题,顺带解决viewpager懒加载,自定义listview上拉加载等等问题。 网络下载用了universal-image-loader框架。自己做项目遇到问题,网上demo一直不可用...
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
ViewPager中嵌套ListView实现了下拉刷新和上拉更多,解决了冲突的问题。