這篇總結一下佈局優化,內容很少。。ide
首先了解一下刷新率的概念。刷新率 Refresh Rate,表明了屏幕在一秒內刷新屏幕的次數。刷新率跟屏幕硬件有關,即特定的屏幕只會有特定刷新率。好比通常電子設備刷新率爲60HZ。佈局
而後是幀率的概念。幀率 Frame Rate,表明了GPU在一秒內操做的屏幕的次數,例如60fps,表示GPU在一秒內對屏幕進行了60次渲染。性能
Android就是經過VSYNC信號來同步UI繪製和動畫,使得它們能夠得到一個達到60fps的固定的幀率。若是刷新率跟幀率不一致(通常是幀率小於刷新率)就會出現卡頓。優化
在上面提到了幀率爲60fps。爲何是這個數呢,這是由於人眼與大腦之間的協做沒法感知超過60fps的畫面更新,通常到了60fps,人腦就會認爲至關流暢了。因此通常就是60fps。動畫
爲了可以使得APP流暢,咱們須要在每一幀之內完成全部的CPU與GPU計算,繪製,渲染等等操做。而一幀在60fps下對應的時間爲 1000ms / 60 ≈ 16.6ms,因此這就是 16ms這個數字的由來。設計
具體到佈局上,優化的核心無非就是減小嵌套,避免過分繪製。代碼規範
其實使用「避免」這個詞也不太穩當,畢竟每一種佈局都有其存在的意義。可是 LinearLayout
這個佈局確實使用起來侷限性挺大。它只適合那種簡單的行或者列的排布,稍微複雜一點的佈局使用 LinearLayout
的話,嵌套層級簡直慘不忍睹。複雜一點的佈局使用RelativeLayout
或者 ConstraintLayout
是比較好的選擇。code
尤爲是 ConstraintLayout
,真的很好用,推薦。orm
抽象佈局標籤,指的是 include
merge
ViewStub
這幾個標籤。你們也已經很熟悉了,其做用就是複用佈局,減小嵌套,延遲加載,總之也是幫助優化佈局。使用方法就不贅述了,網上介紹不少,本身試試就知道了。同步
咱們佈局的時候,每每喜歡順手給佈局添加一個背景。雖然這樣作能夠保證你的佈局任什麼時候候都和設計稿同樣,可是這樣特別影響性能。親身經歷,某頁面很是卡頓,去掉了多餘的 background
,就流暢不少。因此,請去掉沒必要要的 background
。 你能夠給 Activity
定義一個Theme
,經過Theme
定義背景。
以前繪製線性佈局的時候,每每須要給每一項之間繪製一個分隔線,咱們每每都是直接加一個View
。LinearLayoutCompat
帶有一個 divider
屬性,使用它就能夠在佈局中生成分隔線了。
這點是我在網上找到的,本身試了下,發現不生效。有多是個人用法不太對吧。不過如今佈局通常都用 ConstraintLayout
了,這個佈局用到的場景也很少。
這個就不用說了,跑一遍仍是能發現蠻多問題的。關於佈局的問題,主要集中在 Android -> Lint -> Performance
目錄下,裏邊提到的問題要優先解決。另外,阿里代碼規範也會檢測出一些不規範的問題,也要注意一下。