1、如果view消耗了down事件,但是没有消耗其余事件,那么其余事件会传递到viewgroup的onTouchEvent吗?
答案是不会,会直接传回到Activity的onTouchEvent
我觉得这个的关键是执行了viewgroup的dispatchTouchEvent方法还是view的dispatchTouchEvent方法,viewgroup覆写了view的dispatchTouchEvent方法,onTouchEvent方法是在view的dispatchTouchEvent方法中调用的
2、mFirstTouchTarget是一个链表,这个链表的个数什么时候是大于1的?
其实大多数情况下,我们当成一个来处理就行了,下面的参考文章中有介绍什么是情况下会大于1
3、如果一个view消耗了down事件,那么在后面的事件触发后,还会不会再去遍历所有的子view,去找是哪个应该消费事件,换句话说,就是说在后面的move事件发生后,要找消耗了down事件的view,还需要去循环遍历吗所有的字view吗?
答案是不需要,会直接去mFirstTouchTarget为首的链表中查找
参考文章:http://www.cnblogs.com/mmmmar/p/8535557.html
布局:
ViewGroup#dispatchTouchEvent
方法中大部分代码都是在down事件的时候才会去考虑执行的,move、up事件是比较简单的
image.png
LinearLayout1#dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
Log.e("abc","linearlayout1--dispath-->down");
try {
//这儿循环是为了能获取到viewgroup中mFirstTouchTarget的值
Class cls=this.getClass();
while(cls.getSuperclass()!= ViewGroup.class)
{
cls=cls.getSuperclass();
}
Field field=cls.getSuperclass().getDeclaredField("mFirstTouchTarget");
field.setAccessible(true);
Log.e("abc","linearlayout1--dispath-->down"+field.get(this));
} catch (Exception e) {
e.printStackTrace();
}
break;
case MotionEvent.ACTION_MOVE:
Log.e("abc","linearlayout1--dispath-->move");
try {
//这儿循环是为了能获取到viewgroup中mFirstTouchTarget的值
Class cls=this.getClass();
while(cls.getSuperclass()!= ViewGroup.class)
{
cls=cls.getSuperclass();
}
Field field=cls.getSuperclass().getDeclaredField("mFirstTouchTarget");
field.setAccessible(true);
Log.e("abc","linearlayout1--dispath-->move"+field.get(this));
} catch (Exception e) {
e.printStackTrace();
}
break;
case MotionEvent.ACTION_UP:
Log.e("abc","linearlayout1--dispath-->up");
break;
}
return super.dispatchTouchEvent(ev);
}
子view处理了down事件
LinearLayout2#dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
Log.e("abc","linearlayout2--dispath-->down");
break;
case MotionEvent.ACTION_MOVE:
Log.e("abc","linearlayout2--dispath-->move");
try {
//这儿循环是为了能获取到viewgroup中mFirstTouchTarget的值
Class cls=this.getClass();
while(cls.getSuperclass()!= ViewGroup.class)
{
cls=cls.getSuperclass();
}
Field field=cls.getSuperclass().getDeclaredField("mFirstTouchTarget");
field.setAccessible(true);
Log.e("abc","linearlayout2--dispath-->move"+field.get(this));
} catch (Exception e) {
e.printStackTrace();
}
break;
case MotionEvent.ACTION_UP:
Log.e("abc","linearlayout2--dispath-->up");
break;
}
return super.dispatchTouchEvent(ev);
}
子view处理了down事件













网友评论