Android UI 界面繪製原理分析

View類包含Surface(變量名mSurface)。Surface中包含CompatibleCanvas(變量名mCanvas)。CompatibleCanvas繼承至Canval(java.awt.Canval),其中包含一個矩陣對象Matrix(變量名mOrigMatrix)。矩陣Matrix就是一塊內存區域,針對View的各種繪畫操作都保存在此內存中。

每個Surface通常對應兩個buffer,一個front buffer, 一個back buffer。其中,back buffer就是canvas繪圖時對應的bitmap (研究Android_view_Surface.cpp::lockCanvas)。因此,繪畫總是在back buffer上,需要更新時,則將back buffer和front buffer互換。

每個surface又對應一個layer, SurfaceFlinger負責將各個layer的front buffer合成(composite)繪製到屏幕上。

用戶接口方面,主要表現任務由View的各種繼承類來實現。View類的繼承關係如圖所示。

當用戶請求繪製調用invalidate(),此函數會找到當前View或Viewgroup的ParentView,並調用父視圖的invalidateChild(this, r)。invalidateChild會循環調用父視圖的invalidateChildInParent()因此層層向上層視圖調用,直到調用到根視圖ViewRoot。ViewRoot的invalidateChildInParent調用invalidateChild,然後發送消息讓ViewRoot進行繪製。繪製代碼在handleMessage()中的case DO_TRAVERSAL中調用了performTraversals()。

然後調用下一級視圖的draw()函數。draw函數會依次調用以下幾個函數:

background.draw(canvas)

onDraw(canvas)

dispatchDraw(canvas)

onDrawScrollBars(canvas)

在ViewGroup的dispatchDraw中會調用drawChild函數。drawChild根據子View的私有標誌位mPrivateFlags來調用子類的draw()或者dispatchDraw(canvas)。由此實現了層層向下繪製,直到最基本的View。View的dispatchDraw是一個抽象函數,繪製過程到此結束。最後ViewRoot會調用nativeShowFPS(canvas, now - sDrawTime)函數將繪製結果canvas傳遞給本地層進行顯示。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章