先上代码
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,使用的内部拦截法,外部拦截法很麻烦,推荐使用内部拦截法。
这个例子实现了Android界面中常见的GridView显示在ViewPager中滑动的效果,一般作为app首页入口的菜单.自己项目中用到,绝对可用.
两个ViewPager2嵌套,同一方向无法滑动,可以在子 ViewPager2 外面嵌套一层 NestedScrollableHost.
Android Viewpager 嵌套 Viewpager 可以设置 Viewpager 是否可以滑动
viewpager中嵌套fragment,fragment再嵌套viewpager,然后viewpager再次嵌套。
当ViewPager 嵌套时,子ViewPager,不能优先处理滑动事件。 玩一下 网易新闻 客户端,多层嵌套,处理的很流畅,不过也有点小bug。此Demo完美解决ViewPager嵌套的滑动问题,但快速滑动父ViewPager,再滑动ViewPager...
当ViewPager 嵌套时,子ViewPager,不能优先处理滑动事件。 玩一下 网易新闻 客户端,多层嵌套,处理的很流畅,不过也有点小bug。此Demo完美解决ViewPager嵌套的滑动问题,但快速滑动父ViewPager,再滑动ViewPager...
一种很常用的横向滑动的效果,使用的是ViewPager嵌套GridView实现的。项目中需要用到,所以自己写的一个demo分享给大家
自定义viewpager解决scrollview嵌套viewpager不显示和高度自适应
一个viewpager中嵌套多个activity,每当滑动到当前activity时,加载当前activity中的数据,实现异步加载
多个ViewPager嵌套的滑动冲突的处理,处理方法简单易懂,还标有注释,使用过程中没有bug,希望对大家有帮助吧
两个ViewPager嵌套问题.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
完美解决解决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实现了下拉刷新和上拉更多,解决了冲突的问题。
重写了子viewpager的方法,Childviewpager继承了viewpager。解决了父viewpager不能滑动或者子viewpager不能滑动问题。修改了事件的分发。可以使子viewpager滑动到最后一页后直接滑入父viewpager的fragment。修改子...
解决ViewPager嵌套HorizontalScrollView无法滑动,HorizontalScrollView滑动在最左边或者最右边将事件传递给父类控件。
一个特效Demo 具体看博客http://blog.csdn.net/liubo20140401/article/details/47907039 一个向上滑动 tab固定顶部 scrollview中嵌套viewpager嵌套listview 还有回到顶部
复杂界面实现,RecyclerView 嵌套 ViewPager、RecyclerView,多布局实现