首页 > 移动平台 > 详细

我的理解:android事件处理机制

时间:2015-12-17 23:47:42      阅读:442      评论:0      收藏:0      [点我收藏+]

刚做完一个项目,总结一下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则是从下到上传递事件

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

我的理解:android事件处理机制

原文:http://www.cnblogs.com/nice-gh/p/5055567.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!