關於Android onClick 事件的執行條件,
一個事件到達一個View上首先會調用,這個View的dispatchTouchEvent(MotionEvent event)事件
if (onFilterTouchEventForSecurity(event)) {
if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
result = true;
}
//noinspection SimplifiableIfStatement
//li.mOnTouchListener 就是我們設置的
//btn.setOnTouchListener(new View.OnTouchListener(){
// public boolean onTouch(View v, MotionEvent event) {
// return false;
// }
//}); 如果這個方法返回爲true,那麼result的結果就是爲true,此時onTouchEvent 這個方式是得不到執行
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
//如果result 的結果爲false,那麼執行onTouchEvent(event),這個方法
// 在up 事件的時候 有一個 performClick();點擊事件的執行
//
if (!result && onTouchEvent(event)) {
result = true;
}
}
public boolean onTouchEvent(MotionEvent event) {
case MotionEvent.ACTION_UP:
performClick();
break;
}
//這個調用的就是我們傳遞的View.OnClickListener
public boolean performClick() {
li.mOnClickListener.onClick(this);
}
如果一個控件重寫了OnTouchEvent這個方法,那麼想要執行它的onClick事件
那麼OnTouchEvent的方法的返回值必須爲super.onTouchEvent(event);
否則無法執行
onInterceptTouchEvent 這個方法只有ViewGroup這樣的控件採用,因爲它可以包含子view對象