`
lipaneyeti
  • 浏览: 6863 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android2.3版本中viewpager嵌套viewpager响应手势

阅读更多
先上代码
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

    Android Fragment嵌套ViewPager,ViewPager嵌套多个Fragment,Fragment的多层嵌套。csdn博客讲解地址:http://blog.csdn.net/qq_24956515/article/details/50990506

    viewpager嵌套viewpager处理

    viewpager嵌套viewpager滑动处理的demo,使用的内部拦截法,外部拦截法很麻烦,推荐使用内部拦截法。viewpager嵌套viewpager滑动处理的demo,使用的内部拦截法,外部拦截法很麻烦,推荐使用内部拦截法。

    完美解决ViewPager嵌套的滑动问题

    当ViewPager 嵌套时,子ViewPager,不能优先处理滑动事件。 玩一下 网易新闻 客户端,多层嵌套,处理的很流畅,不过也有点小bug。此Demo完美解决ViewPager嵌套的滑动问题,但快速滑动父ViewPager,再滑动ViewPager...

    Android ViewPager嵌套GridView

    在Android开发中,`ViewPager`和`GridView`是两种非常重要的视图组件,它们各自有着独特的功能,并且在很多场景下可以结合起来实现丰富的用户界面。`ViewPager`通常用于实现页面的左右滑动,提供平滑的过渡效果,而`...

    两个ViewPager嵌套问题.rar

    而当我们在一个ViewPager中再嵌套另一个ViewPager时,就会遇到所谓的"两个ViewPager嵌套问题"。这个问题通常涉及到滚动冲突、内存管理和性能优化等多个方面。下面将详细讲解这个主题。 **一、滚动冲突** 两个...

    viewpager中嵌套多个activity

    在“viewpager中嵌套多个activity”的场景下,开发者可能会遇到一些挑战,比如如何有效地管理多个Activity之间的数据加载和通信。在这个主题中,我们将深入探讨如何在ViewPager中实现对多个Activity的嵌套,并进行...

    谷歌官方提供的解决Viewpager2嵌套ViewPager2同一方向无法滑动问题使用到的文件

    两个ViewPager2嵌套,同一方向无法滑动,可以在子 ViewPager2 外面嵌套一层 NestedScrollableHost.

    viewpager嵌套fragment 再嵌套

    在Android开发中,`ViewPager`是一个非常常用的组件,它用于展示可以左右滑动的页面,常用于实现Tab切换或者水平滚动的效果。而`Fragment`则是Android应用中的一个模块化组件,它可以包含UI和其他功能,方便在不同的...

    解决ViewPager嵌套的滑动问题

    当ViewPager 嵌套时,子ViewPager,不能优先处理滑动事件。 玩一下 网易新闻 客户端,多层嵌套,处理的很流畅,不过也有点小bug。此Demo完美解决ViewPager嵌套的滑动问题,但快速滑动父ViewPager,再滑动ViewPager...

    Android Viewpager 嵌套 Viewpager

    在Android开发中,`ViewPager`是一个非常常用的组件,主要用于实现页面滑动效果,常用于创建类似于TabLayout或者轮播图的效果。然而,有时我们需要在`ViewPager`内部再嵌套一个`ViewPager`,来实现更复杂的布局和...

    ViewPager嵌套GridView实现横向滑动效果

    首先,`ViewPager`是Android SDK中的一个组件,它允许用户通过手势在多个全屏视图之间进行平滑的切换。它通常用于构建具有多个页面的应用,如相册、新闻应用等。`ViewPager`的核心在于其适配器,需要自定义一个`...

    完美解决ViewPager两层嵌套滑动问题

    重写了子viewpager的方法,Childviewpager继承了viewpager。解决了父viewpager不能滑动或者子viewpager不能滑动问题。修改了事件的分发。可以使子viewpager滑动到最后一页后直接滑入父viewpager的fragment。修改子...

    scrollview嵌套viewpager不显示、自适应高度

    自定义viewpager解决scrollview嵌套viewpager不显示和高度自适应

    Android-复杂界面实现RecyclerView嵌套ViewPagerRecyclerView多布局实现

    在Android应用开发中,复杂界面的设计常常涉及到组件的嵌套和多布局的使用。本教程将深入探讨如何利用RecyclerView和ViewPager来构建一个高效且可扩展的界面。RecyclerView因其高效的列表展示能力而广受欢迎,而...

    ViewPager嵌套滑动冲突解决

    多个ViewPager嵌套的滑动冲突的处理,处理方法简单易懂,还标有注释,使用过程中没有bug,希望对大家有帮助吧

    类似viewpager嵌套滑动

    2. **处理滚动事件**:在自定义的ViewPager中,我们需要正确处理滑动手势,判断是应该切换页面还是让内部的NestedScrollView滚动。这通常需要对MotionEvent和NestedScrolling事件进行精细的处理。 3. **禁用默认...

    android vierpager+fragment嵌套viewpager+fragment

    在标题“android vierpager+fragment嵌套viewpager+fragment”中,提到了`VierPager`,这可能是作者在描述时的误写,实际上应该是指`ViewPager`。因此,我们主要讨论的是如何在`ViewPager`中嵌套`Fragment`,以及`...

    viewpager嵌套viewpager的demo

    完美解决解决viewpager嵌套viewpager,子viewpager轮播白屏的问题,顺带解决viewpager懒加载,自定义listview上拉加载等等问题。 网络下载用了universal-image-loader框架。自己做项目遇到问题,网上demo一直不可用...

    Android listview和viewpager解决冲突 滑动冲突

    Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631

    安卓ViewPager中嵌套ListView

    ViewPager中嵌套ListView实现了下拉刷新和上拉更多,解决了冲突的问题。

Global site tag (gtag.js) - Google Analytics