這是android觸控事件系列的第二篇,系列文章目錄如下:
大領導給小明安排任務——android觸控事件
大領導又給小明安排任務——android觸控事件
大領導安排任務會經歷乙個「遞」的過程:大領導先把任務告訴小領導,小領導再把任務告訴小明。也可能會經歷乙個「歸」的過程:小明告訴小領導做不了,小領導告訴大領導任務完不成。然後,就沒有然後了。。。。但如果這次完成了任務,大領導還會繼續將後序任務分配給小明。
viewgroup
在遍歷孩子分發觸控事件前還有一段攔截邏輯:
public abstract class viewgroup extends view implements viewparent, viewmanager else
} else
...//當事件沒有被攔截的時候,將其分發給孩子
if (!canceled && !intercepted)
}//將觸控事件分發給觸控鏈
if (mfirsttouchtarget == null) else
}//返回true表示攔截事件,預設返回false
public boolean onintercepttouchevent(motionevent ev)
private boolean dispatchtransformedtouchevent(motionevent event, boolean cancel,view child, int desiredpointeridbits)
...}
}複製**
當允許攔截時,onintercepttouchevent()
會被呼叫,如果過載這個方法並且返回true
,表示viewgroup
要對事件進行攔截,此時不再將事件分發給孩子而是自己消費(通過呼叫view.dispatchtouchevent()
最終走到viewgroup.ontouchevent()
)。
用一張圖總結一下:
public abstract class viewgroup extends view implements viewparent, viewmanager
...}}}
if (mfirsttouchtarget == null)
//觸控鏈不為null,表示有孩子消費了action_down
else
//action_donw的後序事件走這裡
else
...}
predecessor = target;
target = next;}}
...if (canceled
|| actionmasked == motionevent.action_up
|| actionmasked == motionevent.action_hover_move)
return handled;
}private boolean dispatchtransformedtouchevent(motionevent event, boolean cancel,
view child, int desiredpointeridbits) else
//將觸控事件分發給孩子
handled = child.dispatchtouchevent(transformedevent);
}...
return handled;
}/**
* resets all touch state in preparation for a new cycle.
* 重置touch標誌
*/private void resettouchstate
()
/*** clears all touch targets.
* 清空觸控鏈
*/private void cleartouchtargets
() while (target != null);
mfirsttouchtarget = null;}}
}複製**
觸控事件是乙個序列,序列總是以action_down
開始,緊接著有action_move
和action_up
。當action_down
發生時,viewgroup.dispatchtouchevent()
會將願意消費觸控事件的孩子儲存在觸控鏈中,當後序事件會分發給觸控鏈上的物件。
用兩張圖總結一下:
把領導布置任務的故事繼續延展一下:大領導給小領導布置了任務1,小領導把他傳遞給小明,小明完成了。緊接著大領導給小領導布置了任務2,小領導決定自己處理任務2,於是他和小明說後序任務我來接手,你可以忙別的事情。
故事對應的觸控事件傳遞場景是:activity
將action_down
傳遞給viewgroup
,viewgroup
將其傳遞給view
,view
聲稱消費action_down
。activity
繼續將action_move
傳遞給viewgroup
,但viewgroup
對其做了攔截,此時viewgroup
會傳送action_cancel
事件給view
。
看下原始碼:
public abstract class viewgroup extends view implements viewparent, viewmanager else
}...
//如果孩子消費action_down事件,則會在這裡將其新增到觸控鏈中
if (!canceled && !intercepted)
//將觸控事件分發給觸控鏈
if (mfirsttouchtarget == null) else else
//如果傳送了action_cancel事件,將孩子從觸控鏈上摘除
if (cancelchild) else
target.recycle();
target = next;
continue;}}
predecessor = target;
target = next;}}
...}
private boolean dispatchtransformedtouchevent(motionevent event, boolean cancel,view child, int desiredpointeridbits) else
event.setaction(oldaction);
return handled;
}...
}複製**
當孩子消費了action_down
事件,它的引用被會儲存在父親的觸控鏈中。當父親攔截後序事件時,父親會向觸控鏈上的孩子傳送action_cancel
事件,並將孩子從觸控鏈上摘除。後序事件就傳遞到父親為止。 領導安排新崗位
第一 和領導真誠溝通,明確領導對我的期望。首先我覺得這是非常正常的,領導的分配一定是他綜合考慮的結果,他是對我和對單位負責的,我會服從領導的安排,並且我會主動和領導溝通交流,熟悉崗位所要求的技能,主動接受 業務和技能培訓,在新崗位上把工作做好,做細,做紮實。第二 主動學習,掌握技能。新崗位意味著新的...
好的安排小明(南陽19)(DFS)
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描寫敘述 小明十分聰明,並且十分擅長排列計算。比方給小明乙個數字5,他能立馬給出1 5按字典序的全排列,假設你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了。他相同的非常擅長。如今須要你寫乙個程式來驗證擅長排列的小明...
外出前提前跟領導報備,安排工作備份人
這周最大的乙個感觸就是,在外出或者請假前要一定要跟直接上級做好報備,做好工作交接,這也是責任心和職業化的乙個體現。為什麼這麼說呢,事情是這樣的。這週前四天我要在外面參加公司的新員工培訓,但當時手頭上接了一部分另外乙個同事的工作,雖然我跟他打過招呼周一到周四我在外面參加培訓,如果週三要上線的化,這肯定...