Android 事件分发机制

Android 事件分发机制

1.Activity的最顶层的Window是PhoneWindow,Android的最外层嵌套了一个FrameLayout用来包含整个手机的布局,可以在DDMS下用工具能够查看的到,Android截屏的原理是获取到Acitivty的最外层的View的cacheBitmap然后通过画布处理到文件,最外层的View是DecorView.。

2.一个Clickable与LongClickable永远都会消费Touch事件,不管它是diaable还是Disable。

3.View的长按事件是在ACTION_DOWN中执行的,要想执行View的LongClick事件,View的LongClickable必须为True,而且 一定不能执行View的ACTION_MOVE。

4View的点击事件是在ACTION_UP中执行,要想执行Click事件的前提是执行了ACTION_DOWN和ACTION_MOVE,并且没有设置LongClick的情况下,如果设置了Longclick,则longClick必须返回False。

5.如果VIew设置了OnTOuchListener,并且onTouch返回True,则不执行View的OnTouchEvent,即表示了VIew消费了Touch事件,返回Flase则继续执行onTouchEvent()。

6,Touch事件是从最顶层的View分发到最里层的View,如果最里层的VIew消费了ACTION_DOWN事件(设置了OnTouchListener,并且Ontouch()返回的是Ture或者OnTOuchEvent返回的是True)才会触发ACTION_UP与ACTION_MOVE,如果某个VIewGroup拦截了Touch事件,则Touch事件交给ViewGroup处理。

7.Touch事件的分发过程中,如果消费了ACTION_DOWN,而在分发ACTION_MOVE的时候交给了被VIewGroup拦截了,则会将ACTION_CANCEL分发给该ViewGroup下面的Touch到的View,然后将Touch事件交给ViewGroup处理,并返回true



相关:

1.hierarchyviewer查看VIew的布局结构图就能发现最外层嵌套了的FramLayout,最顶层的VIew是DecorView,DecorView下面有一个LinearLayout,LinearLayout嵌套了两个FramLayout,上面的一个是 用来绘制标题栏的,下面的是用户交互的界面,也就是我们setContentView里面的那个View

2.VIew的diapatchTouchEvent(),在源码里面判断了执行的条件

2.1mOnCLickListener不为null,也就是我们设置了View的OnClickLitener

2.2View是否为Enable 这个默认的是able的,除非是手动设置View的Click为diaable

2.3 第三个是View的onTouchListener接口的Ontouch方法的返回值,如果调用了View.setOnTouchListener 的OntouchListener,并且onTouch返回True,VIew的diapatchTouchEvent 就直接返回True,否则就执行View的OntouChEvent 并返回View的OntouchEvent()

3.Touch事件是从顶层的View一直往下分发到手指按下的最里面的View,如果这个View的onTouchEvent()返回false,即不消费Touch事件,这个Touch事件就会向上找父布局调用其父布局的onTouchEvent()处理,如果这个View返回true,表示消费了Touch事件,就不调用父布局的onTouchEvent()



转载自:http://blog.csdn.net/xiaanming/article/details/21696315


你可能感兴趣的:(android,onTouchEvent,布局)