事件冲突总结

来源:互联网 发布:c语言编写程序软件 编辑:程序博客网 时间:2024/05/05 20:45

事件冲突在安卓开发中偶尔会遇到,但是如果不理解事件分发原理,那就很难处理滑动冲突,关于滑动冲突的处理介绍的文章也不少,这里就不过多的重复,自己对项目开发中遇到的冲突进行了总结,在处理事件冲突时我归结为两种方法,

1:上层容器决定法。

2:自身处理法。

上层容器指的是分发事件的父类,不一定是最上层,因为安卓在我们的layoue布局上面还有布局文件,这里说的是我们的layout中的跟布局,凡是包含当前可处理事件控件的布局都可以称为父容器。只是相对的,上层处理法例如360 的详情页面,父容器可以上下滑动,子试图也可以上下滑动,此时就会产生冲突,到底是父容器消费事件还是子view消费就需要我们手动解决,所以我们可以自定义一个linearlayout,本身可以实现上下滑动,但是其内部还需要嵌套一个viewpager,当我们在做好了事件分界线的条件时就可以在父容器的onInterceptouchevent()方法中进行条件判断,如果满足父容器拦截条件则进行拦截,如果不需要则返回false,交由子view处理也就是viewpager进行事件处理,所有事件拦截与否全部由上层容器决定,称为外部拦截法。


当我们在处理滑动冲突时常见的就是子布局和父布局需要在不同时刻响应事件,我们常用的viewpager就是典型的案例,它既可以左右滑动又可以上下滑动,只不过控件内部已经帮我们做好了处理,我们不需要自己处理,但在实际应用中也会遇到我们自己的问题,比如之前有个项目中引用了第三方侧滑菜单slidmenu,我设置的模式是全屏滑动拖出菜单,但同时我们在主页放了一个viewpager,viewpager之间包含多个fragment切换滑动,当我们在viewpager上向右滑动时由于和侧滑呼出菜单的方向是一致,所以导致viewpager不能滑动,直接呼出侧滑菜单,由于slidmenu先拿到事件,所以将滑动事件拦截处理,为此,处理方法就是重写viewpager的dispatchtouchevent()方法,在其中调用getParent().requestDisallowTouchEvent(true)方法·来请求父容器将事件交给其本身处理,此时右滑时事件由viewpager响应,侧滑菜单由于拿不到事件所以无法响应,但当我们的viewpager滑动到最左侧的界面时我们希望调出侧滑菜单,我们可以在方法中进行页面位置判断,如果是第0个页面则不捕获事件,呼出侧滑菜单。

只是自己简单的一些反思


0 0