導致View樹遍歷的時機

遍歷View樹意味著整個View需要重新對其包含的子視圖分配大小并重繪,導致重新遍歷的原因主要有三個
1.視圖本身內部狀況變化引起重繪。
2.第二個是View樹內部添加或者刪除了View。
3.View本身的大小及可見性發生變化。
能引起View樹重新遍歷的操作,總的來講可以分為三類。一類是導致視圖大小發生變化;第二類是導致ViewGroup重新為子視圖分配位置;第三類是視圖顯示情況發生變化需要重繪。這三類情況最后都直接或者間接調用到三個函數,分別為invalidate()、requesetLayout()及requestFocus(),而這三個函數最終都會調用到ViewRoot中的schuedeuleTravesals()函數,該函數然后發起一個異步消息,消息處理中調用performTraversals()開始對整個View進行重新遍歷。
能導致調用invalidate()函數的包含三種情況:
1、當應用程序改變視圖顯示屬性時,調用setVisibility()。
2、當改變視圖Selected狀態時,調用setSelected()。
3、當改變視圖Enable狀態時,調用setEnable()函數。
能導致調用requestLayout()函數的情況包含兩種:
1、當應用程序改變視圖顯示屬性時,調用setVisibility(),由于顯示或者不顯示將影響其他兄弟視圖的位置,因 此會調用到requestLayout()。
2、應用程序直接或間接調用該函數,間接調用是指應用程序調用了View類的其他函數,從而間接調用到requestLayout()。
requestFocus()一般由程序直接調用。
refreshDrawableList()
該函數的作用是根據狀態標識,為視圖賦予不同的Drawable對象。
1、給mPrivateFlags添加DRAWABLE_STATE_DIRTY標識,該標識僅在后面調用getDrawableState()函數中用于判斷是否發生狀態變化。
2、調用drawableSateChanged()。該函數是一個protected類型,只有Framework中的View子類可以重載該函數,一般來講,就是ViewGroup重載了該函數。ViewGroup中重載該函數的作用僅僅是為了配合FLAG_ADD_STATES_FROM_CHILDRN標識,后面將會講到該標識的作用。View類內部,該函數的默認實現包括以下幾項。
(1)調用getDrawableState()獲得視圖的當前狀態,然后再調用onCreateDrawableState()將這些狀態轉換為一個int[]型數組,這個數組的內部格式是預先定好的,DrawableStateList類可以識別該int[]數組。最后再將第一步設置的標識進行清除。
(2)mBGDrawable變量是該視圖的背景圖,它包含一個setState()函數,函數的參數正是上一步獲得的int[]型數組,該函數內部會根據該int[]型數組為mBGDrawable找到真正的Drawable對象。
3、如果該視圖有父視圖,則調用父視圖的childDrawableStateChanged()。父視圖要么是ViewGroup類,要么是一個ViewRoot類。
ensureTouchMode()
這個函數的命名不夠準確,從該函數內部分析來看,其作用是在Touch和非Touch直接切換時對視圖的焦點狀態進行處理。
setVisibility()
該函數用于改變視圖的可視狀態,可視狀態包括GONE、VISIBLE、INVSIBLE三種。該函數內部很簡單,首先調用setFlags(),然后調用mBGDrawable.setVisible()函數改變視圖背景圖的顯示狀態。
setEnable()
Enable狀態僅僅是內部的一個邏輯,不會引起重新布局,僅僅是引起視圖的重繪。
1、給mPrivateFlags變量添加ENABLE或者DISABLE標識,這由setEnalbe()的參數決定。
2、調用refreshDrawableState()重新獲取背景圖。
3、調用invalidate()請求View樹重繪。
invalidate()
該函數的作用是請求View樹進行重繪,當應用程序需要重繪某個視圖時,可以調用該函數。大致做了兩件事情。
1、給所有需要重繪的視圖添加了一個DIRTY或者DIRTY_OPAQUE標記。
2、通過矩形運算,找到真正需要重繪的矩形區,并將其保存在了ViewRoot類中的mDirty變量中。
requestFocus()
要想讓某個視圖獲得焦點
1、用戶使用方向鍵將焦點移動到該視圖(其實也是調用requestFocus()函數完成)。
2、直接調用視圖的requestFocus()函數。
下面分析requestFocus(direction, preFocusRect)的執行過程:
1、判斷該視圖是不是FOCUSABLE的,如果不是,則直接返回false。
2、如果當前是Touch模式,但是視圖的FOCUSABLE_IN_TOUCH_MODE卻為false,即該視圖不能在Touch模式下獲得焦點,則直接返回false。
3、調用hasAncestorThatBlockDescendantFocus()判斷是否父視圖阻止該子視圖獲得焦點,如果阻止,則直接返回false。應用程序可以調用ViewGoup的setDescendantFocusability(int focusability)方法設置該ViewGroup是否阻止其子視圖獲得焦點,默認情況下都不阻止。
4、以上三步實際上執行的都是前期檢查,調用handleFocusGainInternal(dir, rect)進行具體的焦點獲取操作,執行完該函數后,則該視圖肯定獲取焦點,所以返回true。
requestLayout()
該函數的執行過程比較簡單,因為當View樹進行重新布局時,總是重新給所有的視圖進行布局,因為,最簡單的想法就是只要設置一個標識就好。
首先給mPrivateFlags添加FORCE_LAYOUT標識,然后調用mParent的requestLayout()函數。
1、調用checkThread()確保本次調用是在UI線程中執行的,非UI線程執行該函數將導致狀態管理的混亂,并最終crash掉。
2、給ViewRoot中的變量mLayoutRequested賦值為true,之后真正進行布局的代碼將檢查該變量,并決定是否需要重新布局。
3、調用scheduleTraversals()發起一個View樹遍歷的消息,該消息是異步處理的,對應的處理函數是performTraversals()。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389185.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389185.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389185.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是Hyperledger?Linux如何圍繞英特爾的區塊鏈項目構建開放平臺?

訪問區塊鏈會議并關注區塊鏈新聞時,不可避免地,您會遇到Linux基金會的Hyperledger。理解像比特幣、以太坊這樣的加密貨幣還算相對容易的,Hyperledger卻不然。但如果你多研究研究,你會發現一些令人興奮的非貨幣、工業區塊鏈的應用項…

隊列的鏈式存儲結構及其實現_了解隊列數據結構及其實現

隊列的鏈式存儲結構及其實現A queue is a collection of items whereby its operations work in a FIFO — First In First Out manner. The two primary operations associated with them are enqueue and dequeue.隊列是項目的集合,由此其操作以FIFO(先進先出)的方…

安裝

、添加一個新項目->選擇類庫模板->命名為DBCustomAction 2、單擊項目右鍵->添加新項->選擇安裝程序類(命名為DBCustomAction.cs) 3、在 服務器資源管理器中添加->連接到 數據庫->指定用戶密碼(選擇允許保存密碼)-> 數據庫選擇master 4、切換到DBCustomAct…

cad2016珊瑚_預測有馬的硬珊瑚覆蓋率

cad2016珊瑚What’s the future of the world’s coral reefs?世界珊瑚礁的未來是什么? In February of 2020, scientists at University of Hawaii Manoa released a study addressing this very question. The models they developed forecasted a 70–90% worl…

EChart中使用地圖方式總結(轉載)

EChart中使用地圖方式總結 2018年02月06日 22:18:57 來源:https://blog.csdn.net/shaxiaozilove/article/details/79274772最近在仿照EChart公交線路方向示例,開發表示排水網和污水網流向地圖,同時地圖上需要疊加排放口、污染源、污水處理廠等…

android mvp模式

越來越多人討論mvp模式,mvp在android應用開發中獲得更多的重視,這里說一下對MVP的簡單了解。 什么是 MVP? MVP模式使邏輯從視圖層分開,目的是我們在屏幕上怎么表現,和界面如何工作的所有事情就完全分開了。 View顯示數據&…

Node.js REPL(交互式解釋器)

2019獨角獸企業重金招聘Python工程師標準>>> Node.js REPL(交互式解釋器) Node.js REPL(Read Eval Print Loop:交互式解釋器) 表示一個電腦的環境,類似 Window 系統的終端或 Unix/Linux shell,我們可以在終端中輸入命令,并接收系統…

中國移動短信網關CMPP3.0 C#源代碼:使用示例

中國移動短信網關CMPP3.0 C#源代碼:使用示例 中國移動短信網關CMPP3.0 C#源代碼使用,在上一篇文章中我介紹過cmpp3.0,這段時間因為也做關于移動短信網關的開發,在這里給大家一個演示如何使用cmpp3.0開發移動短信網關。Using Tiray.SMS... Ti…

用python進行營銷分析_用python進行covid 19分析

用python進行營銷分析Python is a highly powerful general purpose programming language which can be easily learned and provides data scientists a wide variety of tools and packages. Amid this pandemic period, I decided to do an analysis on this novel coronav…

名稱

命名規則:Go中函數、變量、常量、類型、語句標簽和包的名稱都遵循一個規則,開頭是一個字母或下劃線,后面跟任意字符、數字和下劃線,并區分大小寫。例如:heapSort和HeapSort是不同名稱。關鍵字:Go有25個關鍵…

Alpha沖刺第二天

Alpha第二天 1.團隊成員 鄭西坤 031602542 (隊長) 陳俊杰 031602504陳順興 031602505張勝男 031602540廖鈺萍 031602323雷光游 031602319蘇芳锃 0316023302.項目燃盡圖 3.項目進展 時間工作內容11月18日UI設計、初步架構搭建11月19日UI設計、服務器的進一…

Tiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMS

這是2005年6月云南移動短信網關升級到3.0時寫的,在SP那穩定運行了很長時間的。因為SP倒閉了,貼出來給有興趣的朋友參考。優點:支持多線程、滑動窗口、異步發送、全事件模式、自動識別ASCII、GBK、UCS-2缺點:不支持長短信自動分頁、…

水文分析提取河網_基于圖的河網段地理信息分析排序算法

水文分析提取河網The topic of this article is the application of information technologies in environmental science, namely, in hydrology. Below is a description of the algorithm for ranking rivers and the plugin we implemented for the open-source geographic…

請不要更多的基本情節

“If I see one more basic blue bar plot…”“如果我再看到一個基本的藍色條形圖……” After completing the first module in my studies at Flatiron School NYC, I started playing with plot customizations and design using Seaborn and Matplotlib. Much like doodl…

Powershell-獲取DHCP地址租用信息

需求&#xff1a;業務需要獲取現階段DHCP服務器所有地址租用信息。 1.首先查看DHCP相關幫助信息&#xff1a;2.確定執行命令并獲取相關幫助信息&#xff1a;help Get-DhcpServerv4Scope 名稱 Get-DhcpServerv4Scope 語法 Get-DhcpServerv4Scope [[-ScopeId] <ipaddress[]>…

c# 對COM+對象反射調用時地址參數處理 c# 對COM+對象反射調用時地址參數處理

使用反射的方式調用組件里面的方法&#xff0c;經常會遇見一些象地址參數的處理&#xff0c;在C#中表現為ref參數&#xff0c;比如用C#寫了一個裝配件&#xff0c;里面有一個方法openProcedure(string ProcName,int paraCount,ref string[] parameters)&#xff0c;最后有一個r…

android觸摸消息的派發過程

1.觸摸消息是消息獲取模塊直接派發給應用程序的。 2.觸摸消息在處理時&#xff0c; 需要根據觸摸坐標計算該消息應該派發給哪個View/ViewGroup, 在案件取消處理中不存在 該計算過程。 3.沒有類似”系統按鍵”的”系統觸摸鍵”&#xff0c; 應用程序可完全控制觸摸行為。 4.子…

python 交互式流程圖_使用Python創建漂亮的交互式和弦圖

python 交互式流程圖Python中的數據可視化 (Data Visualization in Python) R vs Python is a constant tussle when it comes to what is the best language, according to data scientists. Though each language has it’s strengths, R, in my opinion has one cutting-edg…

機器學習解決什么問題_機器學習幫助解決水危機

機器學習解決什么問題According to Water.org and Lifewater International, out of 57 million people in Tanzania, 25 million do not have access to safe water. Women and children must travel each day multiple times to gather water when the safety of that water …

遞歸原來可以so easy|-連載(3)

本期我們再通過幾個例子&#xff0c;加深遞歸的理解和熟練度。 上期有一個練習題&#xff1a;用遞歸逆序輸出一個包含整型數據的鏈表。 先完成這個練習題。 對于程序員來說&#xff0c;代碼是最好的溝通工具&#xff0c;什么都不說&#xff0c;上代碼&#xff1a; public class…