Android之Linerlayout、RelativeLayout、FrameLayout性能比較

View和ViewGroup什麼區別?
1.RelativeLayout不但是一個View還可以是一個ViewGroup.
2.ViewGroup內部是可以有子View,這個子View同樣也可能是ViewGroup,以此類推。

View的繪製
1.從ViewRoot的performTraversals()方法開始依次調用perfromMeasure、performLayout和performDraw這三個方法。
這三個方法分別完成頂級View的measure、layout和draw三大流程,其中perfromMeasure會調用measure,measure又會調用onMeasure,在onMeasure方法中則會對所有子元素進行measure,這個時候measure流程就從父容器傳遞到子元素中了,這樣就完成了一次measure過程,接着子元素會重複父容器的measure,如此反覆就完成了整個View樹的遍歷。同理,performLayout和performDraw也分別完成perfromMeasure類似的流程。通過這三大流程,分別遍歷整棵View樹,就實現了Measure,Layout,Draw這一過程,View就繪製出來了。

RelativeLayout和LinearLayout性能對比
1.RelativeLayout會對子View做兩次measure。
首先RelativeLayout中子View的排列方式是基於彼此的依賴關係,而這個依賴關係可能和佈局中View的順序並不相同,在確定每個子View的位置的時候,就需要先給所有的子View排序一下。
2.如果不使用weight屬性,LinearLayout會在當前方向上進行一次measure的過程,如果使用weight屬性,LinearLayout會避開設置過weight屬性的view做第一次measure,完了再對設置過weight屬性的view做第二次measure。由此可見,weight屬性對性能是有影響的,而且本身有大坑,請注意避讓。

總結:
1.RelativeLayout會讓子View調用2次onMeasure,LinearLayout 在有weight時,也會調用子View2次onMeasure
2.RelativeLayout的子View如果高度和RelativeLayout不同,則會引發效率問題,當子View很複雜時,這個問題會更加嚴重。如果可以,儘量使用padding代替margin。
3.在不影響層級深度的情況下,使用LinearLayout和FrameLayout而不是RelativeLayout。
採用RelativeLayout並不會降低層級深度,所以此時在根節點上用LinearLayout是效率最高的。而之所以給開發者默認新建了個RelativeLayout是希望開發者能採用儘量少的View層級來表達佈局以實現性能最優,因爲複雜的View嵌套對性能的影響會更大一些。

4.能用兩層LinearLayout,儘量用一個RelativeLayout,在時間上此時RelativeLayout耗時更小。另外LinearLayout慎用layout_weight,也將會增加一倍耗時操作。由於使用LinearLayout的layout_weight,大多數時間是不一樣的,這會降低測量的速度。這只是一個如何合理使用Layout的案例,必要的時候,你要小心考慮是否用layout weight。總之減少層級結構,纔是王道,讓onMeasure做延遲加載,用viewStub,include等一些技巧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章