view的事件的處理機制-源碼分析
##以ImageView爲例說明View的事件處理機制,ImageView中沒有去重寫dispatchTouchEvent(ev)
view上的dispatchTouchEvent(ev)方法
public boolean dispatchTouchEvent(MotionEvent event) {
...
//mOnTouchListener就是imageView調用setOnTouchListener傳遞進來的對象
//onTouch返回值結果由自己重寫onTouch決定的,如果返回值爲true,那當前if條件滿足,直接返回true,即dispatchTouchEvent返回true
// dispatchTouchEvent返回true,響應所有事件
// 如果onTouch返回的false,順序執行onTouchEvent(event)
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
public void setOnTouchListener(OnTouchListener l) {
mOnTouchListener = l;
}
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(tag, "ImageView onTouch event = "+event.getAction());
return true;
}
});
public boolean onTouchEvent(MotionEvent event) {
...
//當前控件是否可以被點擊,如果可以被點擊進入if,返回true,即dispatchTouchEvent(ev)返回true,響應所有事件
//不可以被點擊,不進入if,直接返回false,即dispatchTouchEvent(ev)返回false,不響應所有事件
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
...
//點擊事件的調用方式,就是回調方法
performClick();
...
return true;
}
return false;
}
//imageView默認沒有可點擊的事件,但如果添加以下代碼,就給其加上了點擊事件
//其實就是調用View中setOnClickListener方法
public void setOnClickListener(OnClickListener l) {
//加上可點擊事件
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//在之前的OnTouchListener中的onTouch方法內部返回false,打印兩次
}
});
public boolean performClick() {
....
if (mOnClickListener != null) {
...
//回調onclick方法
mOnClickListener.onClick(this);
...
}
...
}
view上的dispatchTouchEvent(ev)方法
public boolean dispatchTouchEvent(MotionEvent event) {
...
//mOnTouchListener就是imageView調用setOnTouchListener傳遞進來的對象
//onTouch返回值結果由自己重寫onTouch決定的,如果返回值爲true,那當前if條件滿足,直接返回true,即dispatchTouchEvent返回true
// dispatchTouchEvent返回true,響應所有事件
// 如果onTouch返回的false,順序執行onTouchEvent(event)
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
public void setOnTouchListener(OnTouchListener l) {
mOnTouchListener = l;
}
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(tag, "ImageView onTouch event = "+event.getAction());
return true;
}
});
public boolean onTouchEvent(MotionEvent event) {
...
//當前控件是否可以被點擊,如果可以被點擊進入if,返回true,即dispatchTouchEvent(ev)返回true,響應所有事件
//不可以被點擊,不進入if,直接返回false,即dispatchTouchEvent(ev)返回false,不響應所有事件
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
...
//點擊事件的調用方式,就是回調方法
performClick();
...
return true;
}
return false;
}
//imageView默認沒有可點擊的事件,但如果添加以下代碼,就給其加上了點擊事件
//其實就是調用View中setOnClickListener方法
public void setOnClickListener(OnClickListener l) {
//加上可點擊事件
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//在之前的OnTouchListener中的onTouch方法內部返回false,打印兩次
}
});
public boolean performClick() {
....
if (mOnClickListener != null) {
...
//回調onclick方法
mOnClickListener.onClick(this);
...
}
...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.