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

来源:互联网 发布:linux开启udp端口 编辑:程序博客网 时间:2024/05/16 18:19

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了
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 带电子手刹的车刹车失灵怎么办 下坡刹车失灵遇行人不看车怎么办 跟大车后面看不见红灯闯了怎么办 跟着大货车后面闯了红灯怎么办 如果用工单位不发放加班工资怎么办 事故家属要司机向医院多交钱怎么办 在大学里和室友关系弄僵怎么办 房产证办出来房产局不给证怎么办 单位全员竞聘老员工没岗位怎么办 快件被快递公司签收了没给送怎么办 总公司跑路了分公司代理法人怎么办 大使馆领的结婚证现在离婚怎么办 日本签证照片被使馆贴错了怎么办 在菲律宾护照和签证丢了怎么办 新疆工地上班老板不肯发工资怎么办 德国大使馆签证如果拒签了怎么办 护照在大使馆办签证期间出国怎么办 法院两次判决不准离婚我该怎么办? 法院判决不准离婚妻子不回来怎么办 被告人在不调解的情况下怎么办 知道弟兄的孩子是别人的怎么办? 办居住证的回执单丢了怎么办 领取居住证的回执单丢了怎么办 北京居住证网上申报信息填错怎么办 买家退回来的货有问题怎么办 居转户过程中生的小孩户口怎么办 人才引进申请上海户口被拒怎么办 网络购高铁票身份证没有验证怎么办 高速遇到很浓的团雾怎么办 对于大巴不按座位坐的人该怎么办 火车上遇到占座不让的人怎么办 滁州婴儿打疫苗的绿本子怎么办 检查四维说宝宝嘴巴显示不清怎么办 携程订票付款成功一直没出票怎么办 手机微信支付密码忘了怎么办 存入卡里的钱却说余额不足怎么办 买高铁票身份证未通过审核怎么办 网上订演出票不配送了怎么办 百度糯米订的演出票不配送了怎么办 高铁误点改签后的车次没票了怎么办 高铁晚点没赶上下班车怎么办