學習Android的同學注意了!?。?br>
學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Android學習交流群,群號碼:364595326? 我們一起學Android!
Android中view的事件傳遞是從上往下傳遞的,即事件總是先傳遞給父元素,然后父元素在把事件分發給子View。
事件分發傳遞過程中有一個很重要的對象:MotionEvent,MotionEvent有個方法getAction,該方法返回int類型,我們可以從該返回值中判斷事件類型,典型常見的有以下三種:
ACTION_DOWN:手指剛點擊屏幕時
ACTION_MOVE:手指在屏幕上移動
ACTION_UP:手機離開屏幕
我們把從手指觸摸到屏幕開始直到手指離開屏幕所產生的?一系列事件叫做同一事件序列,一個事件序列包含一個ACTION_DOWN、若干個ACTION_MOVE、一個ACTION_UP。
事件的分發過程由三個很重要的方法來共同完成的:
1、public boolean dispatchTouchEvent(MotionEvent event)
View的分發事件,一個View只要能接收到事件,首先執行的是該方法,而且該方法是一定會執行?,這里我們就稱它為分發事件。
2、public boolean onInterceptTouchEvent?(MotionEvent event)
View的攔截事件,正常情況下dispatchTouchEvent分發事件會調用該方法,該方法的返回值用以判斷當前View是否要攔截該事件,返回true,則當前View的onTouchEvent方法將被調用,并且事件不會傳遞下去。這里我們需要注意一下,如果一個View決定攔截事件,也就是onInterceptTouchEvent返回true,那么在同一個事件序列的其余事件執行過程中并不會在調用該方法。這里我們就稱它為攔截事件。
如果一個View(如TextView,直接繼承于View而不是ViewGroup,不能添加子View),那么該View是沒有onInterceptTouchEvent方法,而且一旦有事件傳遞給它,onToucheEvent方法將會被調用,除非設置不可點擊的(clickable和longClickable同時設為false);?[備注:activity也沒有onInterceptTouchEvent事件]
3、public boolean onTouchEvent(MotionEvent event)
View用來處理點擊事件,返回值表示當前View是否消費了該事件,如果事件傳遞到當前 View 的 onTouchEvent 方法,而該方法返回了 false,那么這個事件會從當前 View 向上傳遞,并且都是由上層 View 的 onTouchEvent 來接收,而且接收不到下一次事件。換句話說就是:如果沒消費,也就是說返回false,那么在同一事件序列的其余事件將不會在傳遞過來。?
如果一個View設置了onTouchListener事件,那么會先執行onTouchListener,然后根據返回值在判斷是否要執行onTouchEvent方法(返回true則不執行onToucheEvent,反之亦然).??
這里有段偽代碼可以把這三個事件的關系表現出來(摘自:android開發藝術):?
public boolean dispatchTouchEvent(MotionEvent event){
? ? boolean consume = false;
? ? if(onInterceptTouchEvent(event)){
? ? ? ? consume = onTouchEvent(event);
? ? }?else{
? ? ? ? consume = child.dispatchTouchEvent(event);?
? ? }
? ? return consume;?
}?
相信大家都看得很清楚。
學習Android的同學注意了!!!
學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Android學習交流群,群號碼:364595326? 我們一起學Android!