1.
View的事件分发有两个重要的方法:diapatchTouchEvent
和touchEvent
|---View
| |---boolean dispatchTouchEvent(MotionEvent event)
| |--- boolean onTouchEvent(MotionEvent event)
1. dispatchTouchEvent
- dispatchTouchEvent中
final int actionMasked = event.getActionMasked();
- ListenerInfo :将
view
所有的listener信息封装到一个对象中。 - 在该方法中有两个判断:
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
2. boolean onTouchEvent
MotionEvent.ACTION_UP:
调用了performClick
三个问题:
1. 在activity中调用了
mTouchView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("TAG", "onTouch: " + event.getAction());
return false;
}
});
mTouchView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("TAG", "onClick: " );
}
});
/***********TabLayout************/
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("TAG", "onTouchEvent: "+event.getAction());
return super.onTouchEvent(event);
}
执行顺序:
2. 如果是Tablyout中直接return ture呢?
不执行onClick,因为onClick在View.OntouchEvent中的ACTION_UP中,若直接return true 就不会走super中的方法。
3. 如果是dispatchEvent return true呢?
什么都不执行
分发流程
super.dispatchEvent->ListenerInfo->super.onTouchEvent(event)->ACTION_UP->performListener().