android開發過程中,由於個性化的需求越來越多,原生的系統的view已經不能滿足於產品的需要。所以開發過程中自定義view已經是家常便飯.
在自定義view中我們經常會用重繪和更新常用的方法有 invalidate、requestlayout
invalidate方法會執行draw過程,重繪view樹。
view執行requestlayout方法,會向上遞迴到頂級父view中,再執行這個頂級父view的requestlayout,所以其他view的onmeasure,onlayout也可能會被呼叫。
總結:view繪製分三個步驟,順序是:onmeasure,onlayout,ondraw。呼叫invalidate方法只會執行ondraw方法;呼叫requestlayout方法只會執行onmeasure方法和onlayout方法,並不會執行ondraw方法。
所以當我們進行view更新時,若僅view的顯示內容發生改變且新顯示內容不影響view的大小、位置,則只需呼叫invalidate方法;若view寬高、位置發生改變且顯示內容不變,只需呼叫requestlayout方法;若兩者均發生改變,則需呼叫兩者,按照view的繪製流程,推薦先呼叫requestlayout方法再呼叫invalidate方法。
其他知識點:
1.invalidate和postinvalidate:invalidate方法只能用於ui執行緒中,在非ui執行緒中,可直接使用postinvalidate方法。
重繪和重排
重繪是乙個元素外觀的改變所觸發的瀏覽器行為,例如改變visibility outline 背景色等屬性。瀏覽器會根據元素的新屬性重新繪製,使元素呈現新的外觀。重繪不會帶來重新布局,並不一定伴隨重排。重排是更明顯的一種改變,可以理解為渲染樹需要重新計算 儘量減少重排次數和縮小重排的影響範圍 1.dom...
重排和重繪
當dom的變化影響了元素的幾何屬性 寬或高 瀏覽器需要重新計算元素的幾何屬性,同時其他元素的幾何屬性和位置也會受到影響。瀏覽器會使渲染樹中受到影響的部分失效,並重新構造渲染樹,這個過程稱為重排。完成重排後,瀏覽器會重新繪製受到影響的部分到螢幕,這個過程稱為重繪。由於瀏覽器的流布局,對渲染樹的計算通常...
回流和重繪
在頁面載入時,瀏覽器把獲取到的html 解析成1個dom樹,dom樹里包含了所有html標籤,包括display none隱藏,還有用js動態新增的元素等。瀏覽器把所有樣式 使用者定義的css和使用者 解析成樣式結構體 dom tree 和樣式結構體組合後構建render tree 渲染樹 然後根據...