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了
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android触摸屏事件派发机制详解与源码分析三(Activity篇)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!【工匠若水 http://blog.csdn.net/yanbobe...
  • yanbober
  • yanbober
  • 2015年05月23日 12:56
  • 16237

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

ViewPager嵌套ViewPager不能响应滑动事件解决方法

不响应原因:  ViewPager嵌套ViewPager或者嵌套ViewFlipper都不能正确相应滑动事件,皆因嵌套的子view在TouchEvent传递过程中没有消费此次事件,而由parent V...
  • hyp712
  • hyp712
  • 2013年04月17日 17:59
  • 6908

Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法

最近项目有一个需求,需要多层可滑动控件的嵌套展示,demo效果如下: 咋一看好像挺简单啊,不就是一个ScrollView + ViewPager + ListView吗,我开始也这样觉得,也用...

ViewPager 嵌套ViewPager 焦点解决

工具         import android.content.Context; import android.graphics.PointF; import android.sup...

Android主页面 多层Fragment嵌套(Fragment+ViewPager)滑动

实现底部Tab和顶部Tab,多层Fragment嵌套,并且底部tab布局灵活性大,顶部Tab是一个Fragment嵌套一个ViewPager,ViewPager中又包含多个Fragment... ...

在屏幕上方是actionBar tab的ViewPager页面里面嵌套子tab并显示于屏幕下方

参考了http://simplehappy.iteye.com/blog/1783845,用android-support-v13里面FragmentTabHost实现,代码片段: public...
  • tedzyc
  • tedzyc
  • 2013年02月03日 22:06
  • 7945

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Fragment与ViewPager嵌套的简单应用

╮(╯▽╰)╭,说好的每天都要要求自己总结呢?昨天又偷懒了,NONONO,临睡前还是及时做下今天的总结吧,话不多说,主要理下思路。那今天就看下Fragment与ViewPager的常规使用,比较常见的...

android 解决ViewPager双层嵌套的滑动问题

今天我分享一下ViewPager的双层嵌套时影响内部ViewPager的触摸滑动问题   之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就是ViewPager,整个软件只有广...
  • dsa63
  • dsa63
  • 2014年10月10日 17:52
  • 430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android进阶-多个ViewPager嵌套时事件传递的处理
举报原因:
原因补充:

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