Android中invalidate
在Android自定義View的開發中,Invalidate是非常常用的一個方法,這邊對這個方法的相關步驟進行一個解析
1、首先,Invalidate呼叫view.invalidateInternal傳入當前view的位置引數
2、在invalidateInternal中判斷當前view的狀態,是否需要重繪,然後透過父View的invalidateChild方法,將需要重繪的區域傳遞給父View
3、接下來讓我們看一下invalidateChild,在invalidateChild中先是設定了需要重繪的區域dirty,之後再do…while中,反覆的呼叫parent = parent.invalidateChildInParent()方法,來呼叫父類的invalidateChildInParent對View的重繪請求進行傳遞
4、然後在ViewGroup.invalidateChildInParent中使用offset,把子View需要重繪的座標區域轉換為父View中的座標區域。之後使用union對子View與父View的區域進行集合運算,獲得需要繪製的區域。
5、在ViewRootImpl.invalidateInparent中,進入之後會執行緒以及重繪區域的檢查,之後呼叫invalidateRectOnScreen方法,然後呼叫scheduleTraversals()方法
6、ViewRootImpl.scheduleTraversals裡面,將會之後handler,之後會呼叫mTraversalRunnable類,從而呼叫doTraversal方法,最後呼叫performTraversals()執行ViewTree的遍歷
7、ViewRootImpl.performTraversals()中,在其中進行View的是否可見,是否為surfasce,是否正在繪製,是否存在於刪除列表中等判斷,之後呼叫performDraw()開始執行繪製。在performDraw()又呼叫了ViewRootImpl的draw方法,並傳遞了fullRedrawNeeded引數,此引數源自mFullRedrawNeeded成員變數,用於表示是否需要重新繪製全部的View
設定了需要重繪的區域dirty
作者:飲歌長嘯
連結:
來源:慕課網
8、然後就會呼叫ViewRootImpl.draw,在draw方法中,根據傳如fullRedrawNeeded引數,設定需要重繪的dirty區域,最後呼叫drawSoftware方法,把引數傳遞進去
9、最後ViewRootImpl.drawSoftware中,首先對canvas進行一些屬性設定,包括色塊、平移等。之後呼叫mView.draw(canvas)方法,開始對View進行繪製
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2765320/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android view中的requestLayout和invalidate方法AndroidView
- android中Invalidate和postInvalidate的區別Android
- Session invalidateSession
- Android自定義View之requestLayout方法和invalidate方法AndroidView
- Android自定義View之invalidate方法和postInvalidate方法AndroidView
- android-invalidate和postInvalidate 的區別及使用Android
- Android學習之 圖解呼叫invalidate()和requestLayout()的過程Android圖解
- 你需要了解下Android View的更新requestLayout與重繪invalidateAndroidView
- Android draw、onDraw、dispatchDraw、invalidate、computeScroll 一些簡要說明Android
- 安卓invalidate()、postInvalidate()、req安卓
- [20120829]分析表與no_invalidate=AUTO_INVALIDATE.txt
- Android筆記:invalidate()和postInvalidate() 的區別及使用——重新整理uiAndroid筆記UI
- oracle dbms_stats(no_invalidate引數)Oracle
- cache操作:clean、invalidate與flush的含義
- 收集統計資訊中的no_invalidate選項對執行計劃的影響
- Oracle收集統計資訊之NO_INVALIDATE引數Oracle
- Oracle 統計量NO_INVALIDATE引數配置(下)Oracle
- Oracle 統計量NO_INVALIDATE引數配置(上)Oracle
- 請問session.invalidate()前是否需要removeAttribute()SessionREM
- View—requestLayout、invalidate 和 postInvalidate 三者的區別View
- Android中MediaRecorderAndroid
- Android中SQLiteAndroidSQLite
- Android中HandlerAndroid
- android中StackViewAndroidView
- Android中ExpandableListView中巢狀ListViewAndroidView巢狀
- android中的ListViewAndroidView
- Android中的RecyclerViewAndroidView
- Android中的intentAndroidIntent
- Android中的BitmapAndroid
- Android中的AOPAndroid
- Android中的NotificationAndroid
- Android中的targetsdkversioinAndroid
- Android中的VectorAndroid
- android中的ViewPageAndroidView
- Android 中的 WindowAndroid
- Android 中的 FORTIFYAndroid
- Android中解析XMLAndroidXML
- Android中的使用Android