




2025年Android事件分發機制:面試官你坐啊.docx 免費下載
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
先自我介紹下,作者浙大畢業,去過小公司,也曾任職華為、字節跳動等大廠,現為阿里技術專家。專注移動開發領域,尤其擅長Android技術棧與跨平臺解決方案。我收集整理了一份《2025年最新Android移動開發全套學習資料》,希望能夠幫助到想自學提升又不知道該從何學起的朋友??體系化內容?:覆蓋Android開發95%核心知識點,包含零基礎入門到高級進階課程?實戰資源?:整合大廠面經、源碼項目、性能優化方案及持續更新技術棧?附加服務?:提供技術交流/職場規劃/內推機會,助力開發者突破成長瓶頸需要的朋友可以十我徽心獲取全套資料:vip204888(備注Android)在GitHub找到大神整理的一份學習Android非常好的資料,分享給大家。本文主要是模擬面試情況提出一些問題以及解答,也當是整個事件分發知識的回顧。讀者也可以嘗試一下看看這些問題是否都能解答出來,好了廢話不多說看正文。HYPERLINK面試開始面試官:學過事件分發嗎,聊聊什么是事件分發事件分發是將屏幕觸控信息分發給控件樹的一個套機制。當我們觸摸屏幕時,會產生一些列的MotionEvent事件對象,經過控件樹的管理者ViewRootImpl,調用view的dispatchPointerEvnet方法進行分發。面試官:那主要的分發流程是什么:在程序的主界面情況下,布局的頂層view是DecorView,他會先把事件交給Activity,Activity調用PhoneWindow的方法進行分發,PhoneWindow會調用DecorView的父類ViewGroup的dispatchTouchEvent方法進行分發。也就是Activity->Window->ViewGroup的流程。ViewGroup則會向下去尋找合適的控件并把事件分發給他。面試官:事件一定會經過Activity嗎?不是的。我們的程序界面的頂層viewGroup,也就是decorView中注冊了Activity這個callBack,所以當程序的主界面接收到事件之后會先交給Activity。但是,如果是另外的控件樹,如dialog、popupWindow等事件流是不會經過Activity的。只有自己界面的事件才會經Activity。Activity的分發方法中調用了onUserInteraction()方法,你能說說這個方法有什么作用嗎?好的。這個方法在Activity接收到down的時候會被調用,本身是個空方法,需要開發者自己去重寫。通過官方的注釋可以知道,這個方法會在我們以任意的方式開始與Activity進行交互的時候被調用。比較常見的場景就是屏保:當我們一段時間沒有操作會顯示一張圖片,當我們開始與Activity交互的時候可在這個方法中取消屏保;另外還有沒有操作自動隱藏工具欄,可以在這個方法中讓工具欄重新顯示。面試官:前面你講到最后會分發到viewGroup,那么viewGroup是如何分發事件的?viewGroup處理事件信息分為三個步驟:攔截、尋找子控件、派發事件。事件分發中有一個重要的規則:一個觸控點的一個事件序列只能給一個view處理,除非異常情況。所以如果viewGroup消費了down事件,那么子view將無法收到任何事件。viewGroup第一步會判讀這個事件是否需要分發給子view,如果是則調用onInterceptTouchEvent方法判斷是否要進行攔截。第二步是如果這個事件是down事件,那么需要為他尋找一個消費此事件的子控件,如果找到則為他創建一個TouchTarget。第三步是派發事件,如果存在TouchTarget,說明找到了消費事件序列的子view,直接分發給他。如果沒有則交給自己處理。面試官:你前面講到“一個觸控點的一個事件序列只能給一個view處理,除非異常情況”,這里有什么異常情況呢?如果發生異常情況該如何處理?這里的異常情況主要有兩點:1.被viewGroup攔截,2.出現界面跳轉等其他情況。當事件流中斷時,viewGroup會發送一個ACTION_CANCEL事件給到view,此時需要做一些狀態的恢復工作,如終止動畫,恢復view大小等等。面試官:那既然說到ACTION_CANCEL類型,那你可以說說還有什么事件類型嗎?除了ACTION_CANCEL,其他事件類型還有:ACTION_MOVE:當我們手指在屏幕上滑動時產生此事件ACTION_UP:當我們手指抬起時產生此事件此外多指操作也比較常見:ACTION_POINTER_DOWN:當已經有一個手指按下的情況下,另一個手指按下會產生該事件ACTION_POINTER_UP:多個手指同時按下的情況下,抬起其中一個手指會產生該事件。一個完整的事件序列是從ACTION_DOWN開始,到ACTION_UP或者ACTION_CANCEL結束。一個手指的完整序列是從ACTION_DOWN/ACTION_POINTER_DOWN開始,到ACTION_UP/ACTION_POINTER_UP/ACTION_CANCEL結束。面試官:哦?說到多指,那你知道ViewGroup是如何將多個手指產生的事件準確分發給不同的子view嗎這個問題的關鍵在于MotionEvent以及ViewGroup內部的TouchTarget。每個MotionEvent中都包含了當前屏幕所有觸控點的信息,他的內部用了一個數組來存儲不同的觸控id所對應的坐標數值。當一個子view消費了down事件之后,ViewGroup會為該view創建一個TouchTarget,這個TouchTarget就包含了該view的實例與觸控id。這里的觸控id可以是多個,也就是一個view可接受多個觸控點的事件序列。當一個MotionEvent到來之時,ViewGroup會將其中的觸控點信息拆開,再分別發送給感興趣的子view。從而達到精準發送觸控點信息的目的。面試官:那view支持處理多指信息嗎?View默認是不支持的。他在獲取觸控點信息的時候并沒有傳入觸控點索引,也就是獲取的是MotionEvent內部數組中的第一個觸控點的信息。多指需要我們自己去重寫方法支持他。面試官:嗯嗯…那View是如何處理觸摸事件的?首先,他會判斷是否存在onTouchListener,存在則會調用他的onTouch方法來處理事件。如果該方法返回true那么就分發結束直接返回。而如果該監聽器為null或者onTouch方法返回了false,則會調用onTouchEvent方法來處理事件。onTouchEvent方法中支持了兩種監聽器:onClickListener和onLongClickListener。View會根據不同的觸摸情況來調用這兩個監聽器。同時進入到onTouchEvent方法中,無論該view是否是enable,只要是clickable,他的分發方法都是返回true。總結一下就是:先調用onTouchListener,再調用onClickListener和onLongClickListener。面試官:你前面多次講到分發方法和返回值,那你可以講講主要有什么方法以及他們之間的關系嗎?嗯嗯。核心的方法有三個:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。簡單來說:dispatchTouchEvent是核心的分發方法,所有分發邏輯都在這個方法中執行;onInterceptTouchEvent在viewGroup負責判斷是否攔截;onTouchEvent是消費事件的核心方法。viewGroup中擁有這三個方法,而view沒有onInterceptTouchEvent方法。viewGroupviewGroup的dispatchTouchEvent方法接收到事件消息,首先會去調用onInterceptTouchEvent判斷是否攔截事件如果攔截,則調用自身的onTouchEvent方法如果不攔截則調用子view的dispatchTouchEvent方法子view沒有消費事件,那么會調用viewGroup本身的onTouchEvent上面1、2步的處理結果為viewGroup的dispatchTouchEvent方法的處理結果,沒有消費則返回false并返回給上一層的onTouchEvent處理,如果消費則分發結束并返回true。viewview的dispatchTouchEvent默認情況下會調用onTouchEvent來處理事件,返回true表示消費事件,返回false表示沒有消費事件第1步的結果就是dispatchTouchEvent方法的處理結果,成功消費則返回true,沒有消費則返回false并交給上一層的onTouchEvent處理簡單來說,在控件樹中,每個viewGroup在dispatchTouchEvent方法中不斷往下分發尋找消費的view,如果底層的view沒有消費事件則會一層層網上調用viewGroup的onTouchEvent方法來處理事件。同時,由于Activity繼承了Window.CallBack接口,所以也有dispatchTouchEvent和onTouchEvent方法:activity接收到觸摸事件之后,會直接把觸摸事件分發給viewGroup如果viewGroup的dispatchTouchEvent方法返回false,那么會調用Activity的onTouchEvent來處理事件第1、2步的處理結果就是activity的dispatchTouchEvent方法的處理結果,并返回給上層面試官:看來你對事件分發了解得挺多的,那你在實際中有運用到事件分發嗎?嗯嗯,有的。舉兩個例子。第一個需求是要設計一個按鈕塊,按下的時候會縮小高度變低同時變得半透明,放開的時候又會回彈。這個時候就可以在這個按鈕的onTouchEvent方法中判斷事件類型:down則開啟按下動畫,up則開啟釋放動畫。同時注意接收到cancel事件的時候要恢復狀態。第二個是滑動沖突。解決滑動沖突的核心思路就是把滑動事件根據具體的情況分發給viewGroup或者內部view。主要的方法有外部攔截法和內部攔截法。外部攔截法的思路就是在viewGroup中判斷滑動的情況,對符合自身滑動的事件進行攔截,對不符合的事件不攔截,給到內部view。內部攔截法的思路要求viewGroup攔截除了down事件以外的所有事件,然后再內部view中判斷滑動的情況,對符合自身滑動情況的時間設置禁止攔截標志,對不符合自身滑動情況的事件則取消標志讓viewGroup進行攔截。面試官:那外部和內部攔截法該如何選擇呢?在一般的情況下,外部攔截法不需要對子view進行方法重寫,比內部攔截法更加簡單,推薦使用外部攔截法。但如果需要在子view判斷更多的觸摸情況時,則使用內部攔截法可更加方法子view處理情況。前面一直聊到觸摸事件,那你知道一個觸摸事件是如何從觸摸屏幕開始產生的嗎?額…在屏幕接收到觸摸信息后,會把這個信息交給InputServiceManager去處理,最后通過WindowManagerService找到符合的window,并把觸摸信息發送給viewRootImpl,viewRootImpl經過層層封和處理之后,產生一個MotionEvent事件分發給view。面試官:可以具體講講前面IMS處理的流程嗎?啊。。這。。。嗯。。。。不會。。。你還有什么想問的嗎?可不可以。。。。給我個小小的點贊再
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吉林省四平市鐵西區2024-2025學年七年級下學期期末練習生物試卷(含答案)
- 財務會計專員崗位職責要求
- 幼兒園常見傳染病預防控制課件
- 財務會計年終工作總結范文(10篇)
- 土地復墾措施及其規劃設計教學課件
- 道德與法治(海南卷)(考試版A3)
- 2025年android音視頻開發面試!這么香的技術還不快點學起來Android篇-andoid視頻秒開面試
- 2024-2025學年下學期高一生物滬科版期末必刷常考題之生物進化論在不斷發展
- 部編版五年級上冊第一單元《白鷺》教案
- 建筑施工特種作業-建筑起重機械安裝拆卸工(塔式起重機)真題庫-5
- 2024北京高考一分一段表
- 公寓中介渠道管理制度
- 出租房合同責任免除協議書
- 中國科技課件
- 2025年希臘語A2等級考試官方試卷
- 地理-2025年中考終極押題猜想(全國卷)
- 2024年廣東省新會市事業單位公開招聘輔警考試題帶答案分析
- 廣安2025年上半年廣安市岳池縣“小平故里英才”引進急需緊缺專業人才筆試歷年參考題庫附帶答案詳解
- 派特靈用于女性下生殖道人乳頭瘤病毒感染及相關疾病專家共識(2025年版)解讀
- 數字化轉型背景下制造業產業鏈協同創新機制研究
- 貴州大學語文試題及答案
評論
0/150
提交評論