編輯:關於Android編程
前面幾篇通過對View樹的measure和layout過程分析事,接下來將結合前兩步得到的測量值及在視圖中的位位置,開始進行繪制操作,一步比一步復雜,draw過程比前面都要復雜,draw的不好,就會出現overdraw。下面請仔細看分析過程:
draw的原始觸發點還是在ViewRootImpl的performTraversals(執行遍歷)方法中,開始分析流程:可以結合我畫的時序圖一起看,方便理解。
measure和layout過程直接調用的是ViewRootImpl的performMeasure和performLayout方法,draw調用的是ViewRootImpl的performDraw()方法,再由performDraw中的draw(boolean fullRedrawNeeded)方法來調用ViewTreeObserver中的dispatchOnDraw()方法,進行通知所有掛在view樹上的view開始draw。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoNCBpZD0="viewtreeobserverdispatchondraw">ViewTreeObserver.dispatchOnDraw()
對於View.java和ViewGroup.java,onDraw()默認都是空實現,因為具體View本身是什麼,這就是做框架,提供空間,你要在裡面自定義什麼view是使用者所決定,但是可以提供默認方法。
View中dispatchDraw()默認為空實現,因為其不包含子view,而ViewGroup重寫了dispatchDraw()來對其子view進行繪制,一般自定義view不應該對dispatchDraw()進行重載,因為它已經體現了View系統繪制的流程。那麼,接下來我們繼續分析下ViewGroup中dispatchDraw()的具體流程:
Draw過程小總結:
自定義View是一個ViewGroup,則需要遞歸繪制包含的所有子View。 View默認不會繪制任何內容,真正的繪制都需要自己在子類中實現,只是做好繪制流程,這就是框架的職責。 區分View動畫和ViewGroup布局動畫,前者指的是View自身的動畫,可以通過setAnimation添加,後者是專門針對ViewGroup顯示內部子視圖時設置的動畫,可以在xml布局文件中對ViewGroup設置layoutAnimation屬性(譬如對LinearLayout設置子View在顯示時出現逐行、隨機、下等顯示等不同動畫效果)。 在獲取畫布剪切區(每個View的draw中傳入的Canvas)時會自動處理掉padding,子View獲取Canvas不用關注這些邏輯,只用關心如何繪制即可。 默認情況下子View的ViewGroup.drawChild繪制順序和子View被添加的順序一致,但是你也可以重載ViewGroup.getChildDrawingOrder()方法提供不同順序。上一篇博客我們講到了ViewRoot中與UI相關的三個重要步驟:performMeasure(測量)、performLayout(布局)和performDraw(繪制),
Fragments的生命周期 每一個fragments 都有自己的一套生命周期回調方法和處理自己
struts2 接收輸入參數的3種方式在我們的生活中,有很多的網頁都存在用戶登陸界面,當我們在登陸界面上輸入自己的用戶名和密碼後,這些數據都會傳入後台,供後台來驗證我們所
我們在選購安卓手機的時候,參數中最容易犯暈的就是ROM和RAM了,許多朋友都不了解是什麼意思,廠家也借助這一點來大做文章,下面我就給大家來簡單的介紹一下其中