Android进阶-多个ViewPager嵌套时事件传递的处理

原创 2015年11月19日 20:47:16

Android进阶-多个ViewPager嵌套时事件传递的处理

先来看一下图:
复杂的UI框架图: 2.5, 2, 4
这里写图片描述
这里写图片描述
这里写图片描述
- 对事件响应的要求

  • 可以看出共有3个ViewPager(分别称为vpOut, vpMiddle, vpInner)和一个SlidingMenu
  • 其中,vpOut是不可以滑动的,它是跟随下面的RadioButtond的点击事件而改变的(实现方法是,继承ViewPager,重写onTouchEcent,并什么都不做)
    1. 侧滑菜单,仅在vpMiddle中的条目为第一条时,才可以滑动出来
      • 处理办法是, 监听vpMiddle的pageChange事件,并在第一个条目时,设置SlidingMenu可以滑出

    @Override
    public void onPageSelected(int position) {
        /*......*/
        if (position == 0) {//只有在第一个页面, 侧边栏才允许出来
            slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); 
        } else {
            slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
        }
    }
    1. 对于最里层的vpInner(展示图片的), 外层的vpMiddle不应拦截他的滑动事件
      • 处理办法是,覆写dispatchTouchEvent()方法, 让父控件,给他处理滑动事件的机会

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
            getParent().requestDisallowInterceptTouchEvent(true);    //请求父控件给他机会                                                        
    }
    1. 继续vpInner的滑动进行处理
      • 从图可以看出,这个voInner是和ListView在一块的
        • 对于上下滑动,他应该响应,并让ListView进行滑动
        • 对于左滑动,当向左滑动到最后一张图片是,应对上一个ViewPager的页面切换,使其切换的下一页
        • 对于右滑动,当向左滑动到最后一张图片是,应对上一个ViewPager的页面切换,使其切换的上一页
        • 因此,可以在2的代码的基础上,继续对滑动事件进行处理

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            getParent().requestDisallowInterceptTouchEvent(true);// 不要拦截,// 这样是为了保证ACTION_MOVE调用
            startX = (int) ev.getRawX();
            startY = (int) ev.getRawY();
            break;

        case MotionEvent.ACTION_MOVE:
            int endX = (int) ev.getRawX();
            int endY = (int) ev.getRawY();

            if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑动
                if (endX > startX) {// 右划
                    if (getCurrentItem() == 0) {// 第一个页面, 需要父控件拦截
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                } else {// 左划
                    if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一个页面,
                                                                            // 需要拦截
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                }
            } else {// 上下滑动
                getParent().requestDisallowInterceptTouchEvent(false);
            }
            break;
        default:
            break;
        }
        return super.dispatchTouchEvent(ev);
    }
  • 小结
  • 应避免这样的问题的出现
    • vpMiddle允许父控件,拦截其触摸事件
    • vpInner不允许父控件,拦截其触摸事件
    • 这时,就没有办法调和了, vpInner肯定是响应不了触摸事件的
    • 解决办法是换一种思路: 绕过事件传递的处理, 在一定条件下, 直接不最外层父控件的触摸事件,给干掉, 那么就ok了
版权声明:本文为博主原创文章,未经博主允许不得转载。

ViewPager显示多个item,Touch事件无死角(不用marginLeft,Right等实现)

ViewPager显示多个item, 实现如下效果: 常规解决办法: 1.设置ViewPager的marginLeft,Right android.support.v4.view....
  • yuchong1234
  • yuchong1234
  • 2016年10月13日 18:32
  • 1176

ViewPager系列之ViewPager一屏显示多个子页面

ViewPager一屏显示多个子页面,常见的有两种形式:1、当前展示的页面右侧显示一部分下个页面的内容2、当前页面居中,左右两边分别显示上一个页面、下一个页面第。 ViewPager 一页显示多个实现...
  • JM_beizi
  • JM_beizi
  • 2016年05月02日 18:43
  • 12139

两种方式处理ViewPager点击事件

我们知道,ViewPager 没有点击事件,许多时候,需要设置点击事件,比如轮询广告点击事件,这时候怎么处理呢?我总结了两种方式: 对 ViewPager 的每个页面设置点击事件 通过onTouch(...
  • lk_123456
  • lk_123456
  • 2017年03月21日 18:43
  • 5539

关于ViewPager的点击事件的处理

我遇到这个问题的前提:只有一个VIewPager,而且里面的图片是动态添加的,通过PageAdapter进行填充的(也就是一个轮播小广告) 由于viewpager没有onclickLisenning...
  • luanxuye
  • luanxuye
  • 2016年05月11日 19:04
  • 9566

处理viewpager、fragment的回收问题

现在对处理viewpager、fragment使用过程中的回收问题,做一下记录 首先看下初始化fragment初始化的代码,对成员变量FragmentA、fragmentB进行赋值,并设置vi...
  • qiebobobo
  • qiebobobo
  • 2017年03月09日 15:59
  • 1346

关于解决多个viewpager嵌套所遇到的事件传递问题

在开发时候我们会有一种情景,类似于新闻客户端的,就是在主页面的viewpager里面的view或者frament中再嵌套了一个viewpager,这时候如果不做任何处理的话,我们父view中的view...
  • cenzr
  • cenzr
  • 2016年03月25日 23:56
  • 1678

viewpager嵌套多个Fragment并处理点击事件

前记: 本身自己对于fragment了解的就不太多,当自己半路插进项目组开始继续开发的时候,我发现了viewpager+fragment   而且做这个功能的那哥们儿告诉我说就差点击事件没实现了、、 ...
  • quanjin24k
  • quanjin24k
  • 2013年11月25日 16:20
  • 7695

从ViewPager嵌套RecyclerView再嵌套RecyclerView看安卓事件分发机制

这两天伟大的PM下了一个需求,在一个竖滑列表里实现一个横向滑动的列表,没错,又是这种常见但是又经常被具有着强烈责任心和职业操守程序员所嗤之以鼻的效果,废话不多说,先上图: 实现的方式很多,因为项...
  • wzlyd1
  • wzlyd1
  • 2017年01月20日 17:30
  • 3928

两种方式处理ViewPager点击事件

我们知道,ViewPager 没有点击事件,许多时候,需要设置点击事件,比如轮询广告点击事件,这时候怎么处理呢?我总结了两种方式: 对 ViewPager 的每个页面设置点击事件 通过onTouch(...
  • lk_123456
  • lk_123456
  • 2017年03月21日 18:43
  • 5539

Android中解决ListView嵌套Viewpager时,滑动事件冲突的方法

1.解决思路             当我们使用ListView嵌套ViewPager时,会出现滑动事件的冲突,我们都知道,Viewpager自己也有滑动的功能,ListView也有滑动的功能,当我...
  • yanxiaosa
  • yanxiaosa
  • 2016年09月20日 13:46
  • 1786
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android进阶-多个ViewPager嵌套时事件传递的处理
举报原因:
原因补充:

(最多只允许输入30个字)