关于Android事件分发机制的理解

来源:互联网 发布:办公室电脑监控软件 编辑:程序博客网 时间:2024/05/21 17:31
要注意控件的两个属性:ENABLE和CLICKABLE

主要讨论的是Button(默认可点击的控件)和ImageView(默认不可点击的控件),因为在dispatchTouchEvent方法中,先要经过一个判断,其中的主要判断条件是ENABLE和onTouch的返回值
  • 如果enable是false,就不会执行onTouch,直接执行onTOuchEvent
  • 如果enable=true,onTouch返回的是true,可以理解为触屏事件被onTouch消费掉了,从而不会再去执行onOuchEvent
  • enable=true,onTouch返回false,这表示先执行onTouch,然后执行onTouchEvent
而在onTouchEvent的执行中,首先有个重要的判断是CLICKABLE,如果是可点击的控件即CLICKABLE=true,就是进入到判断内部,从而执行ACTION.DOWN,ACTION.UP和ACTION.MOVE等操作,但是如果有一个ACTION,如果返回的是false,下面的ACTION都不会再执行?经过实测,在控件的ouTouch中处理ACTION事件时若返回false,则第一个事件之后的事件都不会执行,如果返回的是true则会执行下面的ACTION。

ViewGroup的事件分发机制,基于View的事件分发机制,主要也是dispatchTouchEvent方法,重要的是需要清楚,事件分发的顺序,是从ViewGroup,传递到子View,再回到ViewGourp的dispatchTouchEvent事件,所以ViewGroup的onTouch事件会在子控件的onClick事件之后执行
其中ViewGroup的dispatchTouchEvent方法中先根据onInterceptTouchEvent的返回值进行判断是否拦截事件分发
  • 如果返回是true,即事件分发不会传递到子控件,但ViewGroup的onTouch事件执行,
  • 如果返回是false,事件分发不会被拦截,此时会继续执行下面的判断
在下面的判断中,会根据事件发生的区域,判断是否属于某个子控件的布局范围,然后将事件传递给子控件执行其dispatchTouchEvent方法,或者执行ViewGroup的super.dispatchTouchEvent事件,如果子控件将事件消费掉(即返回值为true),super.dispatchTouchEvent也不会再执行。
0 0
原创粉丝点击