TextView原始碼分析
ofollow,noindex">https://blog.csdn.net/luoshengyang/article/details/8636153
1 繪製材料的準備
畫布(繪製過程) + 輸入(接受使用者互動)
Activity視窗的組成是:PhoneWindow物件,一個DecorView物件,以及一個ViewRoot物件;
- PhoneWindow物件用來描述視窗物件,本身也是一個View
- DecorView物件用來描述視窗的頂層檢視(裝填子View)
-
ViewRoot物件除了用來與WindowManagerService服務通訊之外,還用來接收使用者輸入。
image
2 TextView的繪製過程
- 測量(Measure): 告訴父檢視自己的所佔據的空間的大小
- 佈局(Layout): 控制元件的位置
- 繪製(Draw):
Java層的Canvas實際上是封裝了C++層的SkCanvas。C++層的SkCanvas內部有一塊圖形緩衝區,這塊圖形緩衝區就是 視窗的繪圖表面(Surface) 裡面的那塊圖形緩衝區。
視窗的繪圖表面裡面的那塊圖形緩衝區實際上是一塊匿名共享記憶體,它是 SurfaceFlinger服務 負責建立的。
http://blog.csdn.net/luoshengyang/article/details/7846923
SurfaceFlinger服務建立完成這塊匿名共享記憶體之後,就會將其返回給視窗所執行在的程序。視窗所執行在的程序獲得了這塊匿名共享記憶體之後,就會對映到自己的程序空間來,因此,視窗的控制元件就可以在本程序內訪問這塊匿名共享記憶體了,實際上就是往這塊匿名共享記憶體填入UI資料。注意,這個過程執行完成之後,控制元件的UI還沒有反映到螢幕上來,因為這時候將控制元件的UI資料填入到圖形緩衝區而已。
http://blog.csdn.net/luoshengyang/article/details/8462738
視窗的UI的顯示是WindowManagerService服務 來控制的。因此,當視窗的所有控制元件都繪製完成自己的UI之後,視窗就會向WindowManagerService服務傳送一個Binder程序間程通訊請求。WindowManagerService服務接收到這個Binder程序間程通訊請求之後,就會請求SurfaceFlinger服務重新整理相應的視窗的UI。
3 TextView的獲取鍵盤輸入過程
http://blog.csdn.net/luoshengyang/article/details/6882903
每一個視窗的建立的時候,都會與系統的 輸入管理器 建立一個使用者輸入接收通道。輸入管理器在啟動兩個執行緒,其中一個用來監控使用者輸入,即監控使用者是否按下或者 放開了鍵盤按鍵,或者是否觸摸了螢幕 ,另外一個用來將監控到的使用者 輸入事件分發給當前啟用的視窗來處理 ,而這個分發過程就是通過前面建立的通道來進行的.
ViewRoot類的成員函式 deliverKeyEvent負責分發鍵盤輸入事件 ,而ViewRoot類的成員函式 deliverPointerEvent負責分發觸控式螢幕輸入事件

image