设为首页 加入收藏

TOP

Android Touch事件的分发过程
2014-11-24 02:01:52 来源: 作者: 【 】 浏览:1
Tags:Android Touch 事件 分发 过程

1.View的onTouchEvent()方法返回true和false有什么区别 SDK给出的解释很简单:"返回true代表该事件已经被处理过了,返回false则相反",这句话完全没有解释清楚问题。


2.View的onTouchEvent()方法在处理ACTION_DOWN的时候返回true,在处理ACTION_MOVE的时候返回false,代表着是处理了还是没处理?返回super.onTouchEvent()又是什么含义?


3.重写onTouchEvent()方法和通过setOnTouchListener()设置一个触屏监听有什么区别,看起来好像很类似。


4.View的dispatchTouchEvent(),onTouchEvent(),setOnClickListener(),ViewGroup的onInterceptTouchEvent()把我绕晕了,这些方法怎么使用怎么重写


5.假设一个ViewGroup有两个子view,这两个view有一部分是重叠的,点击该重叠部分,事件由哪个View来处理


6.最重要的一点疑问是:触屏事件从顶层ViewGroup一直向下是怎么传递的


如果你有类似的疑问,相信我的这篇博客能给你答案。


二.首先需要明确的几点是:


1.View一般是为了显示某些内容而存在的,它也通常用来处理用户的触屏等交互事件,而ViewGroup则是做为View的容器而存在的,虽然在代码上它是View的子类,但它通常只是做为容器用来组织它的子视图布局方式。


2.我们知道android里边View层次是一种树型结构,需要明确的是一个ViewGroup它的直接子视图才算是树结构中的儿子,再往下一层就不算了,类似于进程间的父子关系。举例,FrameLayout有两个子视图,分别是LinearLayout和TextView,而LinearLayout又有三个子视图ImageView,那么调用FrameLayout的getChildCount()方法只会返回2,而不是5。因此以下内容中"子视图"这个术语代表着一个ViewGroup的直接子视图,它即可能是一个View类,也可能是一个ViewGroup类。


3.Activity视图的最顶层View是DecorView,它是在PhoneWindow类中通过generateDecor()方法生成的,它继承自FrameLayout,是View层次的根视图。


4.对于触屏来说有三个主要的事件:down,move,up


那么一个触屏事件到底是怎么在View层次中上向下传递的 (这里只考虑事件已经到达DecorView时的情形,事实上是ViewRootImpl类接收到底层InputDispatch传递过来的事件,这里就不写了),ViewRootImpl在deliverPointerEvent()方法中通过调用mView.dispatchPointerEvent(event);将触屏事件传递给了DecorView,DecorView通过dispatchTouchEvent()继续向下传递给子视图,如果子视图也是一个ViewGroup,它又会调用自己的dispatchTouchEvent()方法向下传递,如果子视图是一个View,那么子视图的onTouchEvent()方法就会被调用,如果子视图处理了该事件,那么事件传递就中止。整个过程像是一个递归过程,理解了一个ViewGroup怎么通过dispatchTouchEvent()传递给它的子视图这一层也就理解了整个过程。


这里就不分析ViewGroup的dispatchTouchEvent()方法的代码了,直接给出我总结出来的结论,有兴趣的读者可以分析看看。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言在Linux下递归遍历文件夹中.. 下一篇Linux Qt 环境以及基础

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: