美文网首页
Android 事件处理机制分析

Android 事件处理机制分析

作者: ab64fd4eaee3 | 来源:发表于2017-03-20 01:24 被阅读49次

http://blog.csdn.net/chunqiuwei/article/details/41084921

http://www.jianshu.com/p/35a8309b9597

dispatchTouchEvent:这个方法用来分发TouchEvent。

onInterceptTouchEvent:这个方法用来拦截TouchEvent。

onTouchEvent:这个方法用来处理TouchEvent。

http://www.binkery.com/archives/470.html

public boolean dispatchTouchEvent(MotionEvent event) {

if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {

return true;

}

return onTouchEvent(event);

}

1.

在 dispatchTouchEvent() 方法里,如果 mOnTouchListener 不为空,就调用 mTouchListener.onTouch() 方法,如果返回 true ,那么 dispatchTouchEvent 也就返回 true . 如果 listener 返回 false ,那么就调用 onTouchEvent() 方法。咱们再去看看 onTouchEvent() 方法。

2.

public boolean dispatchTouchEvent(MotionEvent ev)

final boolean intercepted;

intercepted = onInterceptTouchEvent(ev);

if(!intercepted){

for(children){

dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)

}

}

3.

private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel, View child, int desiredPointerIdBits)

if (child == null) {

handled = super.dispatchTouchEvent(event);

} else {

handled = child.dispatchTouchEvent(event);

}

4.

http://hanhailong.com/2015/09/24/Android-%E4%B8%89%E5%BC%A0%E5%9B%BE%E6%90%9E%E5%AE%9ATouch%E4%BA%8B%E4%BB%B6%E4%BC%A0%E9%80%92%E6%9C%BA%E5%88%B6/

Android事件传递流程:

事件都是从Activity.dispatchTouchEvent()开始传递

事件由父View传递给子View,ViewGroup可以通过onInterceptTouchEvent()方法对事件拦截,停止其向子view传递

如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来,也就是说ACTION_DOWN必须返回true,之后的事件才会传递进来

OnTouchListener优先于onTouchEvent()对事件进行消费

http://www.2cto.com/kf/201412/365603.html

/**

* 如果上面的if不满足,当然也不会执行break语句.

* 于是代码会执行到这里来.

*

* 调用方法dispatchTransformedTouchEvent()将Touch事件传递给子View做

* 递归处理(也就是遍历该子View的View树)

* 该方法很重要,看一下源码中关于该方法的描述:

* Transforms a motion event into the coordinate space of a particular child view,

* filters out irrelevant pointer ids, and overrides its action if necessary.

* If child is null, assumes the MotionEvent will be sent to this ViewGroup instead.

* 将Touch事件传递给特定的子View.

* 该方法十分重要!!!!在该方法中为一个递归调用,会递归调用dispatchTouchEvent()方法!!!!!!!!!!!!!!

* 在dispatchTouchEvent()中:

* 如果子View为ViewGroup并且Touch没有被拦截那么递归调用dispatchTouchEvent()

* 如果子View为View那么就会调用其onTouchEvent(),这个就不再赘述了.

*

*

* 该方法返回true则表示子View消费掉该事件,同时进入该if判断.

* 满足if语句后重要的操作有:

* 1 给newTouchTarget赋值

* 2 给alreadyDispatchedToNewTouchTarget赋值为true.

*  看这个比较长的英语名字也可知其含义:已经将Touch派发给新的TouchTarget

* 3 执行break.

*  因为该for循环遍历子View判断哪个子View接受Touch事件,既然已经找到了

*  那么就跳出该for循环.

* 4 注意:

*  如果dispatchTransformedTouchEvent()返回false即子View

*  的onTouchEvent返回false(即Touch事件未被消费)那么就不满足该if条件,也就无法执行addTouchTarget()

*  从而导致mFirstTouchTarget为null.那么该子View就无法继续处理ACTION_MOVE事件

*  和ACTION_UP事件!!!!!!!!!!!!!!!!!!!!!!

* 5 注意:

*  如果dispatchTransformedTouchEvent()返回true即子View

*  的onTouchEvent返回true(即Touch事件被消费)那么就满足该if条件.

*  从而mFirstTouchTarget不为null!!!!!!!!!!!!!!!!!!!

* 6 小结:

*  对于此处ACTION_DOWN的处理具体体现在dispatchTransformedTouchEvent()

*  该方法返回boolean,如下:

*  true---->事件被消费----->mFirstTouchTarget!=null

*  false--->事件未被消费---->mFirstTouchTarget==null

*  因为在dispatchTransformedTouchEvent()会调用递归调用dispatchTouchEvent()和onTouchEvent()

*  所以dispatchTransformedTouchEvent()的返回值实际上是由onTouchEvent()决定的.

*  简单地说onTouchEvent()是否消费了Touch事件(true or false)的返回值决定了dispatchTransformedTouchEvent()

*  的返回值!!!!!!!!!!!!!从而决定了mFirstTouchTarget是否为null!!!!!!!!!!!!!!!!从而进一步决定了ViewGroup是否

*  处理Touch事件.这一点在下面的代码中很有体现.

*

相关文章

网友评论

      本文标题:Android 事件处理机制分析

      本文链接:https://www.haomeiwen.com/subject/kjqbnttx.html