dispatchTouchEvent
作用是:事件分發(fā)颖御。
return true:只執(zhí)行當(dāng)前方法。
return false:傳遞到父控件的onTouchEvent()
return super.dispatchTouchEvent(ev): 1.無子類的view:傳遞到當(dāng)前控件的onTouchEvent()凝颇;2.有子類的view:傳遞到當(dāng)前控件的onInterceptTouchEvent()
可以在這里調(diào)用requestDisallowInterceptTouchEvent()方法來請求父控件的攔截事件
eg1:
/**
* 事件分發(fā), 請求父控件及祖宗控件是否攔截事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getCurrentItem() != 0) {
getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去請求,
// 不攔截
} else {// 如果是第一個頁面, 請求父控件攔截
getParent().requestDisallowInterceptTouchEvent(false);// 攔截
}
return super.dispatchTouchEvent(ev);
}
eg2:
/**
* 事件分發(fā), 請求父控件及祖宗控件是否攔截事件 1. 右劃, 而且是第一個頁面, 需要父控件攔截 2. 左劃, 而且是最后一個頁面, 需要父控件攔截
* 3. 上下滑動, 需要父控件攔截
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);// 不要攔截,
// 這樣是為了保證ACTION_MOVE調(diào)用
startX = (int) ev.getRawX();
startY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) ev.getRawX();
int endY = (int) ev.getRawY();
if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑動
if (endX > startX) {// 右劃
if (getCurrentItem() == 0) {// 第一個頁面, 需要父控件攔截
getParent().requestDisallowInterceptTouchEvent(false);
}
} else {// 左劃
if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一個頁面,
// 需要攔截
getParent().requestDisallowInterceptTouchEvent(false);
}
}
} else {// 上下滑動
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
onInterceptTouchEvent
作用:其方法作用是自身控件是否對事件的消費潘拱;判斷是否傳遞給子控件。注意拧略,無子類view沒有此方法芦岂,
return true:一但返回True(代表事件在當(dāng)前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控件將沒有機(jī)會參與Touch事件)垫蛆,時把事件傳遞給當(dāng)前的控件的onTouchEvent()處理禽最;
return false:返回false,則把事件交給子控件的onInterceptTouchEvent(),傳遞到子控件的dispatchTouchEvent()
調(diào)用順序是:viewgroup.onInterceptTouchEvent->view.onInterceptTouchEvent袱饭,自上往下
onTouchEvent
作用:onTouchEvent是在view中定義的一個方法川无。處理傳遞到view 的手勢事件。手勢事件類型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL四種事件虑乖。
return true:消費當(dāng)前事件懦趋。
return false:false是不消費,則向上傳遞給父控件的onTouchEvent疹味;
調(diào)用順序是:view.onTouchEvent->viewgroup.onTouchEvent,自下往上
另外再講講onTouchListener的onTouch方法
onTouch
onTouch方法是View的 OnTouchListener借口中定義的方法仅叫。
當(dāng)一個View綁定了OnTouchLister后,當(dāng)有touch事件觸發(fā)時佛猛,就會調(diào)用onTouch方法。(當(dāng)把手放到View上后坠狡,onTouch方法被一遍一遍地被調(diào)用)
onTouch優(yōu)先級比onTouchEvent高继找,會先觸發(fā)。
return false: onTouchEvent()是觸發(fā)的上一層activity或者外層viewGroup的onTouchEvent()逃沿,而不是當(dāng)前view的OnTouchEvent()婴渡;
return true: 內(nèi)置諸如click事件的實現(xiàn)等等都基于onTouchEvent,這些事件將不會被觸發(fā)凯亮。