1. 程式人生 > >relativelayout和LinearLayout在實現效果同等情況下選擇使用哪個?為什麼?(學習筆記)

relativelayout和LinearLayout在實現效果同等情況下選擇使用哪個?為什麼?(學習筆記)

首先介紹:

LinearLayout是線性佈局控制元件,它包含的子控制元件將以橫向或豎向的方式排列,按照相對位置來排列所有的widgets或者其他的containers,超過邊界時,某些控制元件將缺失或消失。因此一個垂直列表的每一行只會有一個widget或者是container,而不管他們有多寬,而一個水平列表將會只有一個行高(高度為最高子控制元件的高度加上邊框高度)。LinearLayout保持其所包含的widget或者是container之間的間隔以及互相對齊(相對一個控制元件的右對齊、中間對齊或者左對齊)。
RelativeLayout相對佈局允許子元素指定它們相對於其父元素或兄弟元素的位置,這是實際佈局中最常用的佈局方式之一。它靈活性大很多,當然屬性也多,操作難度也大,屬性之間產生衝突的的可能性也大,使用相對佈局時要多做些測試。

關於View的繪製流程:

    View的繪製流程是從ViewRoot的performTraversals()方法開始,依次經過measure(),layout()和draw()三個過程才最終將一個View繪製出來。

詳細的新能比較:

總結:

RelativeLayout需要對其子View進行兩次measure過程;

而LinearLayout則只需一次measure過程;

所以顯然會快於RelativeLayout,但是如果LinearLayout中有weight屬性,則也需要進行兩次measure,但即便如此,應該仍然會比RelativeLayout的情況好一點。 RelativeLayout另一個性能問題 對比到這裡就結束了嘛?顯然沒有!我們再看看View的Measure()方法都幹了些什麼?

public final void measure(int widthMeasureSpec, int heightMeasureSpec) {  
    if ((mPrivateFlags & PFLAG_FORCE_LAYOUT) == PFLAG_FORCE_LAYOUT ||  
        widthMeasureSpec != mOldWidthMeasureSpec ||  
        heightMeasureSpec != mOldHeightMeasureSpec) {  
                     ......  
      }  
       mOldWidthMeasureSpec = widthMeasureSpec;  
    mOldHeightMeasureSpec = heightMeasureSpec;  
  
    mMeasureCache.put(key, ((long) mMeasuredWidth) << 32 |  
        (long) mMeasuredHeight & 0xffffffffL); // suppress sign extension  
  }  

View的measure方法裡對繪製過程做了一個優化,如果我們或者我們的子View沒有要求強制重新整理,而父View給子View的傳入值也沒有變化(也就是說子View的位置沒變化),就不會做無謂的measure。但是上面已經說了RelativeLayout要做兩次measure,而在做橫向的測量時,縱向的測量結果尚未完成,只好暫時使用myHeight傳入子View系統,假如子View的Height不等於(設定了margin)myHeight的高度,那麼measure中上面程式碼所做得優化將不起作用,這一過程將進一步影響RelativeLayout的繪製效能。而LinearLayout則無這方面的擔憂。解決這個問題也很好辦,如果可以,儘量使用padding代替margin。

似乎看起來Linearlayout比relativelayout效能更好。

但是谷歌的官方說明

A RelativeLayout is a very powerful utility for designing a user interface because it can eliminate nested view groups and keep your layout hierarchy flat, which improves performance. If you find yourself using several nested LinearLayout groups, you may be able to replace them with a single RelativeLayout

Google的意思是“效能至上”, RelativeLayout 在效能上更好,因為在諸如 ListView 等控制元件中,使用 LinearLayout 容易產生多層巢狀的佈局結構,這在效能上是不好的。而 RelativeLayout 因其原理上的靈活性,通常層級結構都比較扁平,很多使用LinearLayout 的情況都可以用一個 RelativeLayout 來替代,以降低佈局的巢狀層級,優化效能。所以從這一點來看,Google比較推薦開發者使用RelativeLayout,因此就將其作為Blank Activity的預設佈局了。

最後:

還是選擇relativelayout吧,降低佈局巢狀,優化效能