|
當(dāng)人們談?wù)揂ndroid性能的時(shí)候總是習(xí)慣討論怎么寫出清晰高效的Java代碼,卻忽略了layout布局文件。layout布局緩慢的渲染速度對(duì)app性能也有的很大的影響。充滿不必要的views和可讀性差的layout文件會(huì)讓你的app運(yùn)行緩慢。在本文中我會(huì)分享5個(gè)技巧來幫你寫出高效清晰的layout布局文件。(ps:下面的技巧都非常實(shí)用,開發(fā)過程中很常見,感動(dòng)哭!) 1. Use compound drawable on a TextView
(ps:難以理解現(xiàn)在還有很多人不懂得用這個(gè),實(shí)實(shí)在在的減少很多view啊,哎!) 通常你需要在文本旁邊添加一張圖片,假設(shè)你需要添加圖片在文字的左邊,像下面這樣: TextView
不少人首先想到的就是用一個(gè)LinearLayout或RelativeLayou來包含一個(gè)TextView和ImageView,最后你用了三個(gè)UI元素和一大坨代碼。用TextView的compound drawable是一個(gè)更好更清晰的解決方案。你只需要一個(gè)屬性就可以搞定。
用到的主要屬性: drawableLeft- 指定drawable放在文本的左邊 drawableStart- 作用和drawableLeft相同但是它基于新的API(android 4.2)支持RTL drawablePadding- 指定文本和drawable之間padding 2. ImageView has src and background attribute
你應(yīng)該同時(shí)使用它們,在很多情況下你會(huì)想要給ImageView添加點(diǎn)擊效果,然后我看到很多人用LinearLayout來包裹一個(gè)ImageView來實(shí)現(xiàn)。添加另一個(gè)view是沒必要的。下面的代碼可以讓你做的更好:
顯示圖片用"src"屬性,drawable selector 圖片點(diǎn)擊效果用"background"屬性實(shí)現(xiàn),上面用的是android默認(rèn)提供的selector,當(dāng)然你也可以換成你自己實(shí)現(xiàn)的。下面是最后的效果:(ps:哈哈,效果自己copy上面幾行代碼就可以看到了,實(shí)在需要看請(qǐng)翻墻查看原文)。 3. Use LinearLayout divider
分割線在app經(jīng)常會(huì)用到的,使用頻率高到讓你驚訝。但是LinearLayout有一個(gè)屬性可以幫你添加分割線。下面的例子中,LinearLayout包含2個(gè)TextView和基于他們中間的分割線。 divider
1.Create divider shape(創(chuàng)建shape)下面是一個(gè)簡(jiǎn)單的shape divider_horizontal.xml用來當(dāng)做分割線。
2.Add shape to LinearLayout
上面用到了三個(gè)xml屬性: divider -用來定義一個(gè)drawable或者color作為分割線 showDividers -指定分割線在哪里顯示,它們可以顯示在開始位置,中間,末尾或者選擇不顯示 dividerPadding -給divider添加padding 4.Use the Space view
當(dāng)你需要在2個(gè)UI控件添加間距的時(shí)候,你可能會(huì)添加padding或margin。有時(shí)最終的layout文件是非?;靵y,可讀性非常差。當(dāng)你需要解決問題時(shí),你突然意識(shí)到這里有一個(gè)5dp的paddingTop,那里有一個(gè)2dp的marginBottom,還有一個(gè)4dp的paddingBottom在第三個(gè)控件上然后你很難弄明白到底是哪個(gè)控件導(dǎo)致的問題。還有我發(fā)現(xiàn)有些人在2個(gè)控件之間添加LinearLayout或View來解決這個(gè)問題,看起來是一個(gè)很簡(jiǎn)單解決方案但是對(duì)App的性能有很大的影響。 這里有一個(gè)更簡(jiǎn)單更容易的方法那就是Space,看下官方的文檔:“Space is a lightweight View subclass that may be used to create gaps between components in general purpose layouts.” 他們沒有說謊,確實(shí)很輕量。如果你看過Space的實(shí)現(xiàn)會(huì)發(fā)現(xiàn)Space繼承View但是沒有繪制任何東西在canvas。
使用方法很簡(jiǎn)單,看下面的圖片,我們想要在在標(biāo)題和描述之間添加間距。 space
你只需要簡(jiǎn)單的在2個(gè)TextView之間添加一個(gè)Space就可以了
5.Use <include/> and <merge/>
重用布局是一個(gè)保持app一致的好方法,這樣以后有改變的話只要改一個(gè)文件就可以了,Android提供了<include/>標(biāo)簽幫你重用布局。 例如你現(xiàn)在決定創(chuàng)建有一個(gè)logo圖片居中的酷炫Toolbar工具欄,然后你想要添加到每個(gè)頁面中,下面是Toolbar效果: toolbar
下面是batman_toolbar.xml代碼
你可以復(fù)制粘貼這些代碼到每個(gè)Activity,但是不要這么做,在編程中有一個(gè)重要的規(guī)則:當(dāng)你復(fù)制粘貼,那你就是在做錯(cuò)誤的事。在這種情況下你可以用<include/>標(biāo)簽在多個(gè)界面重用這個(gè)布局。
用<include/>標(biāo)簽?zāi)憧梢灾挥靡恍写a在app的每個(gè)頁面添加你的toolbar,任何改變都會(huì)自動(dòng)更新到所有頁面。 除了<include/>,<merge/>也常用來從你的view層次結(jié)構(gòu)中減不必要的view,它會(huì)移除沒必要的嵌套的layouts,例如,如果被包含布局文件的根是一個(gè)LinearLayout,然后你把它include包含在另外一個(gè)LinearLayout里面,2個(gè)嵌套的LinearLayouts是沒有必要的,這個(gè)嵌套的layout沒有任何作用除了影響UI性能。在這種情況下可以用<merage/\>來替換被包含布局的根LinarLayout 移除不必要的view. 關(guān)于<include/>和<merge/>的更多信息你可以查看官方文檔 Don’t always play by the rules
我希望這5個(gè)技巧可以幫你寫出更好更簡(jiǎn)單的布局layout,但是不要把這些技巧當(dāng)是規(guī)則,它們更像是指南??傆幸恍┣闆r下你沒法使用這些技巧,只能通過增加布局的復(fù)雜性來解決。在這種情況下,在添加更多view之前,你可以考慮自定義View試的找到更簡(jiǎn)單的解決方法。只要記住一件事,在你的視圖層次添加一個(gè)view代價(jià)是不可小噓的,它會(huì)影響你的app加載速度。 謝謝Ana和oFca對(duì)文章進(jìn)行校對(duì)。 |
|
|