程序员人生 网站导航

[置顶] 事件传递之一(基本概念)

栏目:综合技术时间:2015-04-07 08:59:35

Android事件传递机制之1

      所谓事件传递是指在Android利用程序开发中,当有多个View叠加在同1个区域内,如果按下View所在的区域,按下的Down、Move,Up事件将如何进行传递的进程。

      假定1个ViewGroup里面包括了1个View,当用户按下View时,ViewGroup和View有哪些方法会触发呢。

 在了了解这些事件传递之前,我们先来了解1下几个方法的概念:

 1. dispatchTouchEvent:此方法只有继承ViewGroup的类才有,是指向childView分发事件的函数,即当手按下了View(或ViewGroup)的位置,都会通过ViewGroup的dispatchTouchEvent事件,也就是它是所有View事件获得到之前触发,所有childView的事件都是通过dispatchTouchevent分发的。

 2. onInterceptTouchEvent:此方法只有继承ViewGroup的类才有,在dipatchTouchEvent分发后,就会被onInterceptTouchEvent所捕获,此方法起到1个拦截事件的作用,

    如果此方法return true,则表示不会再继续处理后续的事件。例如当onInterecptTouchEvent的Down的时候返回了true,则事件将不会继续传递给子View的onTouchEvent了,

   而是将事件传给当前ViewGroup的onTouchEvent进行处理

3.onTouchEvent:: 此方法不论是ViewGroup,还是View都有此都有,由于不论是ViewGroup还是View都是View的子类,所以onTouchEvent是View的函数。


以下举1个具体的实例来,描写事件传递进程

假定1个LinearLayout里面包括了1个TextView,当用户点击TextView中,事件将是如何传递的(为了描写方便,分别使用L1,T1)

1.默许情况下按以下顺序传递事件

   L1的dispatchTouchEvent的Down  -> L1的onInterecptTouchEvent的Down  ->T1的onTouchEvent的Down,默许情况下都是这个传递顺序

  1.        假设 T1的onTouchEvent的Down  return false了,则事件到此消失,不再继续传递下去 
  2.        假设T1的onTouchEvent的Down  return true 了, 则事件将会被传递到L1的onTouchEvent中,因而事件便有了以下流程
  3.        L1的dispatchTouchEvent的Down  -> L1的onInterecptTouchEvent的Down  ->T1的onTouchEvent的Down  ->L1的onTouchEvent的Down

2.因而我们可以得出以下结论

  1. 如果child view的onTouchEvent返回true,则Down事件将不再继续往下传递,如果child view的onTouchEvent返回的是false,则Down继续传递给childview 的parent的onTouchEvent
  2. Up事件不会走Down事件的onTouchEvent传递进程,谁处理了OnTouchEvent的Down事件并且返回了true(则事件不再继续传递下去),谁就处理Up事件,所以如果Down事件传递到了最顶级的Parentview,而最顶级的Parent view的onTouchEvent返回了false,则程序将丢失Up事件。



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐