android事件处理机制

刚做完一个项目,总结一下Touch事件处理。(需要解决viewPage和可放缩移动的imgView之间的滑动冲突)

1.在未从Touch事件分发、拦截、处理等方面进行处理时,img横向滑动便会引发Viewpager的滑动

然而 如果你先上下移动img 再水平移动img就不会导致vp的滑动why?

2.在进行了事件分发的处理,处理如下:

在img的onTouchEvent方法中加上判断逻辑,满足逻辑return true , 消费这个事件,不返回给parent处理;不满足逻辑return false,交给parent的onTouchEvent处理;

重写了 vp 的 onInterceptTouchEvent方法,根据img中设置的全局变量进行判断,如果满足就返回false 表示不拦截,交给子View;如果不满足就 用返回 super.onInterceptTouchEvent

3.进行了第2步所示的处理之后,可以根据自定义条件阻止或允许 vp左右滑动

 总结: Touch事件包括Down , Move , Up , Cancel 等(未考虑多点触控),一个事件例如 onClick,onScroll,OnFling等都是由许多Touch事件组成的。-> 1个 Down ,n个Move ,1个Up 构成了Android中众多的事件

 当OnTouch事件发生时,Android的GroupView会调用如下几个方法:

public boolean dispatchTouchEvent(MotionEvent ev)//分发事件

public boolean onInterceptTouchEvent(MotionEvent ev)//拦截事件

public boolean onTouchEvent(MotionEvent ev)//处理事件

 

假设一个 Linear 中包含一个 tv ,以此为例:

当用户点击屏幕时,(如果你实现了 android.view.View.OnTouchListener接口,那么就会在onTouch方法中接受到这个事件),首先是 linear的 dispatchTouchEvent会首先被调用,用于事件分发,这个类比如调用super.dispatchTouchEvent() 否则后面两个方法无法执行,这个方法基本没有必要重写。 然后系统会调用linear的OnInterceptTouchEvent(),如果这个方法返回true则会截断事件的传递,交给linear的onTouchEvent()进行事件的处理,这用情况下面的子View就不会获得此次Touch事件,称之为“截断”;如果返回false则会将事件传递给其子View tv, 此时会调用子View tv的OnTouchEvent方法,如果tv的此方法返回true,表示已“消费”这个事件,事件不会再传递到其上层控件的OnTouchEvent方法中去;如果返回false则会传递给上层的OnTouchEvent方法进行处理,如果上层对象(应该为最上层容器)的此方法也返回false就表示放弃这个Touch事件

 

所以 OnInterceptTouchEvent从上到下传递事件;onTouchEvent则是从下到上传递事件

这只是最基本的用法,还有滑动 快速滑动等手势操作 将会在之后补充~

posted on 2015-12-17 22:43  nice-gh  阅读(271)  评论(0编辑  收藏  举报

导航