大領導又給小明安排任務 Android觸控事件

2021-09-24 08:27:48 字數 3677 閱讀 9994

這是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_moveaction_upaction_down發生時,viewgroup.dispatchtouchevent()會將願意消費觸控事件的孩子儲存在觸控鏈中,當後序事件會分發給觸控鏈上的物件。

用兩張圖總結一下:

把領導布置任務的故事繼續延展一下:大領導給小領導布置了任務1,小領導把他傳遞給小明,小明完成了。緊接著大領導給小領導布置了任務2,小領導決定自己處理任務2,於是他和小明說後序任務我來接手,你可以忙別的事情。

故事對應的觸控事件傳遞場景是:activityaction_down傳遞給viewgroupviewgroup將其傳遞給viewview聲稱消費action_downactivity繼續將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個數字中選出幾個數字讓他繼續全排列,那麼你就錯了。他相同的非常擅長。如今須要你寫乙個程式來驗證擅長排列的小明...

外出前提前跟領導報備,安排工作備份人

這周最大的乙個感觸就是,在外出或者請假前要一定要跟直接上級做好報備,做好工作交接,這也是責任心和職業化的乙個體現。為什麼這麼說呢,事情是這樣的。這週前四天我要在外面參加公司的新員工培訓,但當時手頭上接了一部分另外乙個同事的工作,雖然我跟他打過招呼周一到周四我在外面參加培訓,如果週三要上線的化,這肯定...