成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android:一個(gè)高效的UI才是一個(gè)拉風(fēng)的UI(二)

移動(dòng)開發(fā) Android
前篇博客翻箱倒柜的介紹了優(yōu)化UI設(shè)計(jì)的兩個(gè)方法,第一個(gè)就是使用盡量少的組件來實(shí)現(xiàn)布局功能,第二個(gè)就是使用<meger>標(biāo)簽來減少不必要的根節(jié)點(diǎn),這兩個(gè)方法都可以提高應(yīng)用UI的運(yùn)行效率,但是夠了嗎?遠(yuǎn)遠(yuǎn)是不夠的,方法就像money一樣永遠(yuǎn)不嫌多,所以不再介紹多一些UI設(shè)計(jì)優(yōu)化的方法說得過去么?

前篇博客翻箱倒柜的介紹了優(yōu)化UI設(shè)計(jì)的兩個(gè)方法,***個(gè)就是使用盡量少的組件來實(shí)現(xiàn)布局功能,第二個(gè)就是使用<meger>標(biāo)簽來減少不必要的根節(jié)點(diǎn),這兩個(gè)方法都可以提高應(yīng)用UI的運(yùn)行效率,但是夠了嗎?遠(yuǎn)遠(yuǎn)是不夠的,方法就像money一樣永遠(yuǎn)不嫌多,所以不再介紹多一些UI設(shè)計(jì)優(yōu)化的方法說得過去么?

摸摸口袋里面的都快四歲、運(yùn)行著古老的android 2.2系統(tǒng)的屌絲機(jī)對(duì)于我來說,隨便一個(gè)大于10M的應(yīng)用都有完爆他幾條街死機(jī)崩潰的超能力。但是對(duì)于某信來說,如今已經(jīng)24M大小的它依然在屌絲機(jī)瀕臨垂死的硬件資源上運(yùn)行如飛(至少?zèng)]崩潰過),讓我不得不感嘆應(yīng)用優(yōu)化做的相當(dāng)不錯(cuò),也滿足我們這種屌絲在深深的寂寞夜晚來搖一發(fā)的情感需求。所以來說,一個(gè)應(yīng)用能贏得市場(chǎng),不僅僅是贏得先機(jī),而更多的是因?yàn)橄嗤枨笏δ茏龅谋饶愫茫嗤δ芩饶愕暮?jiǎn)約,相同簡(jiǎn)約設(shè)計(jì)它運(yùn)行比你快!

排隊(duì),一個(gè)一個(gè)慢慢來

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

解決方案有哪些?當(dāng)然很簡(jiǎn)單的就是,取消牛逼哄哄的切換動(dòng)畫咯,但是如果你的產(chǎn)品經(jīng)理死活不同意那還不得另尋途徑。在不放棄動(dòng)畫的前提下,我們可以把某些measure呀、layout呀、draw呀的步驟延遲在動(dòng)畫后面執(zhí)行不就行咯,排隊(duì)一個(gè)一個(gè)來,至于怎么操作呢?那我們要引入一個(gè)輕量級(jí)組件<ViewStub>,也就是動(dòng)態(tài)加載的方法。

我們通常使用它來做預(yù)加載處理,來改善頁面加載速度和提高流暢性,ViewStub本身不會(huì)占用層級(jí),它最終會(huì)被它指定的層級(jí)取代。有時(shí)候我們也需要復(fù)雜的視圖且少用,我們可以按需要的時(shí)候裝載以便減少內(nèi)存,提高體驗(yàn)。以前我們都是設(shè)置在布局中,然后使用View.GONE屬性來隱藏組件,但是耗資源影響性能。總得來說這玩意就是一個(gè)輕量級(jí)的View,它一個(gè)看不見的,不占布局位置,占用資源非常小的控件。

下面上代碼:

要加載的ActivityB布局(復(fù)雜的動(dòng)畫代碼請(qǐng)忽略)

  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> 

在這個(gè)UI界面中,當(dāng)我們切換ActivityB時(shí),因?yàn)榧骖櫟絼?dòng)畫效果。所以我們就讓ViewStub暫緩加載比較復(fù)雜的布局,而先把較為簡(jiǎn)單的顯示加載畫面loading_image加載出來,當(dāng)稍后時(shí)間我們就在代碼里面開始加載該布局,見代碼如下:

  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);//設(shè)置加載資源 
  10.   LoadHandler.postDelayed(new Runnable() {   
  11.     @Override   
  12.     public void run() {   
  13.       myStub.inflate();//開始加載復(fù)雜界面 
  14.       loadingView.setVisibility(View.GONE);//隱藏臨時(shí)加載的簡(jiǎn)單界面 
  15.     }   
  16.   },500); 

上面代碼實(shí)現(xiàn)了先執(zhí)行復(fù)雜動(dòng)畫,當(dāng)切換界面到到500ms時(shí),handler開始執(zhí)行加載復(fù)雜的界面子線程,從而錯(cuò)開了資源的集中利用,這里使用的是動(dòng)態(tài)添加ViewStub指向布局資源的方法,簡(jiǎn)單而實(shí)用吧,對(duì)于一個(gè)用戶來說,延遲半秒加載界面遠(yuǎn)遠(yuǎn)比切換畫面卡頓更容易接受。

使用ViewStub需要主要幾點(diǎn):

1、ViewStub只能被Inflate一次,當(dāng)Inflate之后ViewStub對(duì)象就被置為空值,說得更通俗點(diǎn)就是當(dāng)ViewStub被某個(gè)布局Inflate后,就不能通過ViewStub來控制它,因?yàn)樗呀?jīng)功成身退了,自然對(duì)于需要不同場(chǎng)景下顯示隱藏的情況建議用visibility。

2、ViewStub只能用來Inflate一個(gè)布局文件,對(duì)于單個(gè)具體的View它是無能為力的,當(dāng)然如果把View搞在某個(gè)布局文件中也是可以接受的。

3、VIewStub中不能嵌套merge標(biāo)簽。

重用布局是一個(gè)好習(xí)慣

重用是一個(gè)好習(xí)慣,既然大家都常念叨,無圖無真相呀樓主,為了避免大家說no picture you say a jb~這類回復(fù),我還是勉勉強(qiáng)強(qiáng)上個(gè)圖吧。

這個(gè)界面由三個(gè)小部分組成,分別是標(biāo)題欄、內(nèi)容顯示和底端按鈕。如果你手指閑不住前前后后點(diǎn)一點(diǎn),按一按;會(huì)發(fā)覺各個(gè)界面的風(fēng)格驚人的相似!而且不僅僅是在這軟件上會(huì)體現(xiàn),而且市場(chǎng)上大部分應(yīng)用都是這樣!其實(shí)說白了這就是一個(gè)風(fēng)格的問題。

那么,既然這么多重復(fù)了,作為二十一世紀(jì)標(biāo)準(zhǔn)碼農(nóng)的我們來說,我們能忍受這種浪費(fèi)嗎?所以我們要用用<include>標(biāo)簽——模塊化布局。

布局如下:多簡(jiǎn)單的layout復(fù)用,你還會(huì)說你不喜歡用<include>標(biāo)簽嗎?

  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、模塊化布局,提高重用率,易于日后的維護(hù)和擴(kuò)展。

2、降低生成的app的體重,用戶的流量是很貴的!

簡(jiǎn)單說說剩下的點(diǎn)

1、減少不必要的inflate

(1)對(duì)于inflate的布局可以直接緩存,用全部變量代替局部變量,避免下次需再次inflate

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

(2)BaseAdapter中item的convertView緩存用法,詳細(xì)請(qǐng)參考《關(guān)于BaseAdapter的使用及優(yōu)化心得》

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

2、避免有太多的視圖

每個(gè)視圖都會(huì)消耗內(nèi)存,在一個(gè)布局中布置太多的視圖,布局會(huì)占用過多的內(nèi)存,假設(shè)一個(gè)布局包含超過80個(gè)視圖,layoutopt可能會(huì)給出下面這樣的建議:

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

上面給出的建議是視圖數(shù)量不能超過80,當(dāng)然***的設(shè)備有可能能夠支持這么多視圖,但如果真的出現(xiàn)性能不佳的情況,***采納這個(gè)建議。

3、千萬別布局嵌套太多

布局不應(yīng)該有太多的嵌套,layoutopt(和Android團(tuán)隊(duì))建議布局保持在10級(jí)以內(nèi),即使是***的平板電腦屏幕,布局也不應(yīng)該超過10級(jí),RelativeLayout可能是一個(gè)解決辦法,但它的用法更復(fù)雜,好在Eclipse中的Graphical Layout資源工具更新后,使得這一切變得更簡(jiǎn)單。

下面是布局嵌套太多時(shí),layoutopt的輸出內(nèi)容:

-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 

嵌套布局警告通常伴隨有一些無用布局的警告,有助于找出哪些布局可以移除,避免屏幕布局全部重新設(shè)計(jì)。

4、在某些場(chǎng)景下使用非主線程繪制的UI組件,具體組件名稱我忘了,后面想起來補(bǔ)上哈。

本文鏈接:http://www.cnblogs.com/net168/p/4017921.html

責(zé)任編輯:chenqingxiang 來源: cnblogs
相關(guān)推薦

2014-10-14 15:50:19

UIAndroid

2020-04-17 10:58:12

UI設(shè)計(jì)師按鈕

2016-10-20 19:27:00

開源項(xiàng)目bootstrapcss框架

2021-01-19 13:10:29

ZshLinuxUbuntu

2016-05-18 15:13:49

快碼CTO互聯(lián)網(wǎng)創(chuàng)業(yè)

2017-09-15 15:13:33

效果設(shè)備UI

2012-05-28 15:31:57

App-UI

2014-07-17 15:38:43

UI設(shè)計(jì)師移動(dòng)端

2016-09-26 17:26:20

2013-10-18 10:10:23

2024-11-29 12:51:18

2024-04-10 12:39:08

機(jī)器學(xué)習(xí)庫(kù)python

2013-03-04 16:45:49

2013-03-26 13:02:58

UI設(shè)計(jì)易用用戶體驗(yàn)

2024-02-07 08:52:07

VueUI 庫(kù)Vue.js

2023-01-03 12:30:25

架構(gòu)CPUGPU

2022-02-10 10:48:23

JavaScriptVue.js數(shù)據(jù)

2022-04-28 09:05:41

網(wǎng)絡(luò)爬蟲Python

2013-09-11 16:02:00

Spark分布式計(jì)算系統(tǒng)

2013-02-22 18:37:50

容錯(cuò)服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品久久久久久久久久久久 | 精品国产乱码久久久久久88av | 亚洲色图综合 | 国产精品久久久久久久久久 | 91精品久久久久久久久久入口 | 三级在线观看 | 亚洲精品二区 | 久久久国产一区二区三区 | 国产高清一区二区 | 日韩久久久久久 | 亚洲欧美在线视频 | 成人免费视频观看 | 国产成人免费视频网站高清观看视频 | 中文字幕视频在线看 | 午夜精品久久久 | 男人的天堂在线视频 | 欧美日本久久 | 成人免费精品 | 91pron在线 | 国产精品久久午夜夜伦鲁鲁 | 激情久久av一区av二区av三区 | 无毛av | a黄视频 | 一区二区av| 蜜桃在线一区二区三区 | 久久机热| 午夜成人免费视频 | 日韩欧美精品 | 久久久久国产一区二区三区四区 | 性一交一乱一伦视频免费观看 | 久久99精品久久久久久琪琪 | 男女性毛片 | 日日天天| 91亚洲国产成人久久精品网站 | www.玖玖玖| 久久国内精品 | 成人在线观看免费 | 亚洲国产精品网站 | 国产精品久久久久久久午夜 | 久久亚洲国产 | 免费观看一级黄色录像 |