New UI-關於布局最佳化集錦,newui-布局集錦
New UI-關於布局最佳化集錦
——轉載請註明出處:coder-pig,歡迎轉載,請勿用於商業用途!
小豬Android開發交流群已建立,歡迎大家加入,無論是新手,菜鳥,大神都可以,小豬一個人的
力量畢竟是有限的,寫出來的東西肯定會有很多紕漏不足,歡迎大家指出,集思廣益,讓小豬的博文
更加的詳盡,幫到更多的人,O(∩_∩)O謝謝!
小豬Android開發交流群:小豬Android開發交流群群號:421858269
新Android UI執行個體大全目錄:http://blog.csdn.net/coder_pig/article/details/42145907
本節引言:
前面已經介紹了三個與布局最佳化有關的三個標籤:include,ViewStub,merge;
相信大家對布局最佳化有了一些認識,在這一章節的最後一節裡,我們就來嘮叨嘮叨
關於布局最佳化的一些建議!大家在實際開發中可以參考下,從而製作出更高效,
複用性更高的布局UI,好了廢話就到這裡,開始本節的內容吧!
本節本文:
1.布局優先考慮RelativeLayout:
①在規劃最外層的布局的時候,我們優先考慮RelativeLayout,堅決不使用AbsoluteLayout
(當然基本上沒人會這樣做),要麼RelativeLayout要麼LinearLayout!
②在布局層次相同的情況下,就是線性布局與相對布局層次一樣的時候,建議使用LinearLayout,因為
前者的效能比RelativeLayout的效能要高!
③當布局比較複雜的時候,這個時候使用LinearLayout實現效果可能需要多重嵌套,而實現相同的效果,
RelativeLayout卻僅僅需要一層,這種情況下用哪個好就不言而喻了吧!
ps:當然,根據不同的情況你可以用FrameLayout,TableLayout,GridLayout啦,按需使用~
2.用好三個布局最佳化的標籤:
①多次複用的組件,抽取出來到一個布局檔案上,通過include標籤引入
②對於不常用,又可能會用到布局,又或者頁面中東西太多,某些部分可以暫時不顯示,等使用者互動再載入,
從而提高頁面載入速度,這個時候你可以用<ViewStub>
③對於有用到FrameLayout的布局可以考慮使用merge來替代,又或者include進來的布局,可以使用
merge作為最外面的標籤,從而可以達到減少視圖層次的目的!
3.內嵌時少用LinearLayout的weight屬性:
當多層嵌套的時候,盡量少使用LinearLayout的weight權重屬性,因為系統需要花費很多
系統資源,因為每一個子控制項都需要被測量兩次,在使用GridView,ListView等控制項的時候,
這個問題更加嚴重,因為子控制項會被重複建立,所以,當多層內嵌時盡量避免使用weight屬性!
4.書寫規範的最佳化:
對id,資源,以及通用資源的命名,盡量正常化,比如:
一個登陸的輸入框:login_edit_username
一個添加的按鈕:ic_add ...等等
當然,不一定使用上面這種寫法,但是你必須有遵循一個規範
另外,還是建議給不同的控制項設定不同的id!!!
5.提高控制項的尋找效率:
在前面的學習中,我們通過Hierarchy Viewer可以知道,當我們載入布局檔案後,會產生一個以
PhoneWindow$DecorView為根節點的控制項樹,而我們在操作控制項時,必須尋找到對應的控制項!
我們通常會在Activity的onCreate()中通過findViewById找到相應控制項,然後對其進行初始化!
再執行相關操作,設定相關屬性或者加事件監聽等,而findViewById方法是從控制項樹的根節點開始
遞迴尋找。由於樹形結構的特殊性,我們可以根據控制項樹的特點來選擇尋找控制項的策略,減少尋找次數
最佳化尋找路徑!
①先尋找外層:
比如一個LinearLayout布局,定義了多個Button控制項,如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕3" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕4" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕5" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕6" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕7" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕8" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕9" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕10" /></LinearLayout>
如果需要初始化所有的Button,你會怎麼寫?大部分朋友可能會先為每個按鈕設定一個id
直接這樣寫:
Button btn1 = (Button) findViewById(R.id.btn1);Button btn2 = (Button) findViewById(R.id.btn2);Button btn3 = (Button) findViewById(R.id.btn3);Button btn4 = (Button) findViewById(R.id.btn4);Button btn5 = (Button) findViewById(R.id.btn5);Button btn6 = (Button) findViewById(R.id.btn6);Button btn7 = (Button) findViewById(R.id.btn7);Button btn8 = (Button) findViewById(R.id.btn8);Button btn9 = (Button) findViewById(R.id.btn9);Button btn10 = (Button) findViewById(R.id.btn10);
再對每個Button完成相關操作,但是機智的你肯定會發現,代碼的重複的太高了,而且定義了很多變數
對於按鈕這種東西,很多時候我們僅僅是為他設定一個點擊事件而已,於是乎我們可以這樣來尋找控制項:
找到外部LinearLayout的容器控制項,然後調用getChildAt方法獲得按鈕控制項,並完成初始化:
ViewGroup parent = (ViewGroup)findViewById(R.id.parent);int count = parent.getChildCount();for(int i = 0;i < count;i++){Button button = parent.getChildAt(i);//為Button執行相關操作}
明顯後者的代碼由於前者的代碼,而且當子控制項越多,控制項樹層次越多的時候,優勢更加明顯;
從改善後的代碼,我們可以發現另外一個更加重要的原則:
再尋找控制項的時候,儘可能從遠離控制項最近的節點開始!
②從離控制項最近的節點開始
要尋找一個嵌套層次較深的布局中的一個控制項,比如在有一個Button和TextView中三層
嵌套的LinearLayout中,要找這兩個組件,你要怎麼找呢?直接:
Button btn = (Button)findViewById(R.id.btn);TextView txt = (TextView)findViewById(R.id.txt);
上面的寫法肯定能組成工作的,但是當控制項嵌套層次很深的時候,而且尋找控制項的次數很多的
時候,這種方法會降低控制項尋找的效能,而對於這種情況,我們僅僅需要添加一行代碼就可以進行
最佳化:
View parent = findViewById(R.id.parent); //找到控制項所在的節點(前置容器)
在尋找組件的前面添加這個語句,當控制項數量很多的時候,他的優勢就會很明顯,而且有些情況下
都必須這樣寫,儘管不建議大家給不同的控制項設定相同的id,但當使用ListView這樣的空間的時候
就會一直這樣做,而findViewById的尋找策略是:尋找到第一個與id匹配的控制項就停止尋找,所以
尋找結果可能不是實際需要的空間,所以從靠近控制項的節點開始,不但提高尋找速度,而且還能
更加精確的尋找到控制項,當然,還是建議大家給不同的控制項設定不同的id值!!!
---第五點內容摘自:http://www.devdiv.com
最後說幾句:
關於布局最佳化的東西,肯定不止上面這些,限於筆者水平,現在知道的就這些,以後有什麼新
學到的東西一定分享給大家,另外關於ListView等控制項最佳化的就不在這篇東西裡面進行
闡述了,可見listView章節的內容!謝謝~