Android 界麵繪製實現
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傳遞給本地層進行顯示。
最後更新:2017-04-03 05:39:54