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


更多相关文章

  1. Android一个textview显示多段文本不同颜色并可以响应点击事件
  2. Android Layout布局文件里的android:layout_height等属性为什么
  3. android RelativeLayout属性和布局实例
  4. Android界面编程——Android布局组件(二)
  5. 关于界面布局的一些小知识
  6. Android事件机制之二:onTouch详解
  7. Android 第七课——UI布局
  8. android布局文件属性说明(转)

随机推荐

  1. Android EventBus 源码解析
  2. 单独编译android framework模块出现的问
  3. Android延长Toast的时间
  4. android onSaveInstanceState方法 横坚屏
  5. 关于Android ListView组件中android:draw
  6. Android(安卓)获取外部存储设备列表
  7. Android(安卓)Studio 非常好用的几款插件
  8. Android NDK c调用java代码
  9. Android(安卓)游戏设计教程:游戏元素和工
  10. Bitmap和Drawable相互转换方法