Android:一個高效的UI才是一個拉風的UI(二)

來源:互聯網
上載者:User

Android:一個高效的UI才是一個拉風的UI(二)

前篇部落格翻箱倒櫃的介紹了最佳化UI設計的兩個方法,第一個就是使用盡量少的組件來實現布局功能,第二個就是使用<meger>標籤來減少不必要的根節點,這兩個方法都可以提高應用UI的運行效率,但是夠了嗎?遠遠是不夠的,方法就像money一樣永遠不嫌多,所以不再介紹多一些UI設計最佳化的方法說得過去嗎?

摸摸口袋裡面的都快四歲、運行著古老的android 2.2系統的屌絲機對於我來說,隨便一個大於10M的應用都有完爆他幾條街死機崩潰的超能力。但是對於某信來說,如今已經24M大小的它依然在屌絲機瀕臨垂死的硬體資源上運行如飛至少沒崩潰過),讓我不得不感歎應用最佳化做的相當不錯,也滿足我們這種屌絲在深深的寂寞夜晚來搖一發的情感需求。所以來說,一個應用能贏得市場,不僅僅是贏得先機,而更多的是因為相同需求它功能做的比你好,相同功能它比你的簡約,相同簡約設計它運行比你快!

排隊,一個一個慢慢來

當ActivityA跟ActivityB打招呼說:“偶要回家了,你來頂上”。說明就馬上溜得無影無蹤,這時候急呀,ActivityB趕緊measure呀、layout呀、draw呀趕緊搞出一個介面來應付觀眾先,忙的不亦樂乎;更要命這時候的是他們還要搞一個交接儀式——超炫超牛的切換動畫!然而在日益無窮大的慾望與逐漸乾癟的資源這強大的根本矛盾下,毫不猶豫的當機了幾百毫秒。這一卡頓讓手機前的強迫症患者來說是多大的心理創傷,自然而然會說:“這軟體真渣!切個畫面都會總得頓一下才死心”。使用者體驗瞬間降為0~

解決方案有哪些?當然很簡單的就是,取消牛逼哄哄的切換動畫咯,但是如果你的產品經理死活不同意那還不得另尋途徑。在不放棄動畫的前提下,我們可以把某些measure呀、layout呀、draw呀的步驟延遲在動畫後面執行不就行咯,排隊一個一個來,至於怎麼操作呢?那我們要引入一個輕量級組件<ViewStub>,也就是動態載入的方法。

我們通常使用它來做預先載入處理,來改善頁面載入速度和提高流暢性,ViewStub本身不會佔用層級,它最終會被它指定的層級取代。有時候我們也需要複雜的視圖且少用,我們可以按需要的時候裝載以便減少記憶體,提高體驗。以前我們都是設定在布局中,然後使用View.GONE屬性來隱藏組件,但是耗資源影響效能。總得來說這玩意就是一個輕量級的View,它一個看不見的,不佔布局位置,佔用資源非常小的控制項。

下面上代碼:

要載入的ActivityB布局複雜的動畫代碼請忽略)

 
  1. <meger xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="match_parent" 
  3.     android:layout_height="match_parent" 
  4.     > 
  5.     <ViewStub   
  6.         android:id="@+id/mystub"   
  7.         android:layout_width="match_parent" 
  8.         android:layout_height="match_parent" 
  9.         /> 
  10.     <ImageView 
  11.         android:id="@+id/loading_image"   
  12.         android:layout_width="match_parent" 
  13.         android:layout_height="match_parent" 
  14.         android:src="@drawable/loading_image" 
  15.         /> 
  16. </meger> 

在這個UI介面中,當我們切換ActivityB時,因為兼顧到動畫效果。所以我們就讓ViewStub暫緩載入比較複雜的布局,而先把較為簡單的顯示載入畫面loading_image載入出來,當稍後時間我們就在代碼裡面開始載入該布局,見代碼如下:

 
  1. @Override 
  2. protected void onCreate(Bundle savedInstanceState) {   
  3. super.onCreate(savedInstanceState);   
  4. setContentView(R.layout.layout_loading);   
  5.            
  6. LoadHandler = new Handler();   
  7. myStub = (ViewStub)findViewById(R.id.mystub);  
  8. loadingView = (ImageView)findViewById(R.id.loading_image);   
  9. myStub.setLayoutResource(R.layout.layout_main);//設定載入資源 
  10. LoadHandler.postDelayed(new Runnable() {   
  11. @Override   
  12. public void run() {   
  13. myStub.inflate();//開始載入複雜介面 
  14. loadingView.setVisibility(View.GONE);//隱藏臨時載入的簡單介面 
  15. }   
  16. },500); 

上面代碼實現了先執行複雜動畫,當切換介面到到500ms時,handler開始執行載入複雜的介面子線程,從而錯開了資源的集中利用,這裡使用的是動態添加ViewStub指向布局資源的方法,簡單而實用吧,對於一個使用者來說,延遲半秒載入介面遠遠比切換畫面卡頓更容易接受。

使用ViewStub需要主要幾點:

1、ViewStub只能被Inflate一次,當Inflate之後ViewStub對象就被置為空白值,說得更通俗點就是當ViewStub被某個布局Inflate後,就不能通過ViewStub來控制它,因為它已經功成身退了,自然對於需要不同情境下顯示隱藏的情況建議用visibility。

2、ViewStub只能用來Inflate一個布局檔案,對於單個具體的View它是無能為力的,當然如果把View搞在某個布局檔案中也是可以接受的。

3、VIewStub中不能嵌套merge標籤。

重用布局是一個好習慣

重用是一個好習慣,既然大家都常念叨,無圖無真相呀樓主,為了避免大家說no picture you say a jb~這類回複,我還是勉勉強強上個圖吧。

這個介面由三個小部分組成,分別是標題列、內容顯示和底端按鈕。如果你手指閑不住前前後後點一點,按一按;會發覺各個介面的風格驚人的相似!而且不僅僅是在這軟體上會體現,而且市場上大部分應用都是這樣!其實說白了這就是一個風格的問題。

那麼,既然這麼多重複了,作為二十一世紀標準碼農的我們來說,我們能忍受這種浪費嗎?所以我們要用用<include>標籤——模組化布局。

布局如下:多簡單的layout複用,你還會說你不喜歡用<include>標籤嗎?

 
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="fill_parent" 
  3.     android:layout_height="fill_parent" 
  4.     android:orientation="vertical" 
  5.     > 
  6.  <include android:id="@+id/head_menu" layout="@layout/head_menu" /> 
  7.  <include android:id="@+id/content" layout="@layout/content_showweibo" /> 
  8.  <include android:id="@+id/bottom_menu" layout="@layout/bottom_menu" /> 
  9. </LinearLayout> 

使用<include>的好處有:

1、模組化布局,提高重用率,易於日後的維護和擴充。

2、降低產生的app的體重,使用者的流量是很貴的!

簡單說說剩下的點

1、減少不必要的inflate

(1)對於inflate的布局可以直接緩衝,用全部變數代替局部變數,避免下次需再次inflate

 
  1. if (loadingView != null) { 
  2.     loadingView.setVisibility(View.VISIBLE); 
  3. else{ 
  4.     loadingView =LayoutInflater.from(context).inflate(R.layout.loadingView, this, true); 

(2)BaseAdapter中item的convertView緩衝用法,詳細請參考《關於BaseAdapter的使用及最佳化心得》

PS:第一次寫的博文,寫的渣得不能看。。。。。。

2、避免有太多的視圖

每個視圖都會消耗記憶體,在一個布局中布置太多的視圖,布局會佔用過多的記憶體,假設一個布局包含超過80個視圖,layoutopt可能會給出下面這樣的建議:

  
  1. -1:-1 This layout has too many views: 83 views, it should have <= 80!  

上面給出的建議是視圖數量不能超過80,當然最新的裝置有可能能夠支援這麼多視圖,但如果真的出現效能不佳的情況,最好採納這個建議。

3、千萬別布局嵌套太多

布局不應該有太多的嵌套,layoutopt和Android團隊)建議布局保持在10級以內,即使是最大的平板電腦螢幕,布局也不應該超過10級,RelativeLayout可能是一個解決辦法,但它的用法更複雜,好在Eclipse中的Graphical Layout資源工具更新後,使得這一切變得更簡單。

下面是布局嵌套太多時,layoutopt的輸出內容:

-1:-1 This layout has too many nested layouts: 12 levels, it should have <= 10!305:318 This LinearLayout layout or its RelativeLayout parent is possibly useless 

嵌套布局警告通常伴隨有一些無用布局的警告,有助於找出哪些布局可以移除,避免螢幕布局全部重新設計。

4、在某些情境下使用非主線程繪製的UI組件,具體組件名稱我忘了,後面想起來補上哈。

本文連結:http://www.cnblogs.com/net168/p/4017921.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.