国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Android 布局優(yōu)化

移動開發(fā) Android
在開發(fā)過程中我們經(jīng)常說性能優(yōu)化,但性能優(yōu)化是一個比較寬泛的概念。在Android開發(fā)中性能優(yōu)化可能包括:Java代碼優(yōu)化, 算法優(yōu)化, SQLite優(yōu)化, 布局優(yōu)化等。那么這篇博客就來總結(jié)并分享下Android開發(fā)中的布局優(yōu)化。

布局原則

在Android UI布局過程中,通過遵守一些慣用、有效的布局原則,我們可以制作出高效且復用性高的UI,概括來說包括如下幾點:

盡量多使用RelativeLayout 和LinearLayout, 不要使用絕對布局AbsoluteLayout,在布局層次一樣的情況下, 建議使用LinearLayout代替RelativeLayout, 因為LinearLayout性能要稍高一點,但往往RelativeLayout可以簡單實現(xiàn)LinearLayout嵌套才能實現(xiàn)的布局。

將可復用的組件抽取出來并通過include標簽使用;

使用ViewStub標簽來加載一些不常用的布局;

使用merge標簽減少布局的嵌套層次;

RelativeLayout VS LinearLayout

***條原則說了布局層次一樣的情況下LinearLayout比RelativeLayout要好, 但往往RelativeLayout可以簡單實現(xiàn)LinearLayout嵌套才能實現(xiàn)的布局。假如需要實現(xiàn)如下布局:

用LinearLayout來實現(xiàn)xml代碼如下:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="fill_parent" 
  3.     android:layout_height="?android:attr/listPreferredItemHeight" 
  4.     android:padding="6dip"
  5.      
  6.     <ImageView 
  7.         android:id="@+id/icon" 
  8.         android:layout_width="wrap_content" 
  9.         android:layout_height="fill_parent" 
  10.         android:layout_marginRight="6dip" 
  11.         android:src="@drawable/icon" /> 
  12.  
  13.     <LinearLayout 
  14.         android:orientation="vertical" 
  15.         android:layout_width="0dip" 
  16.         android:layout_weight="1" 
  17.         android:layout_height="fill_parent"
  18.  
  19.         <TextView 
  20.             android:layout_width="fill_parent" 
  21.             android:layout_height="0dip" 
  22.             android:layout_weight="1" 
  23.             android:gravity="center_vertical" 
  24.             android:text="My Application" /> 
  25.              
  26.         <TextView   
  27.             android:layout_width="fill_parent" 
  28.             android:layout_height="0dip" 
  29.             android:layout_weight="1"  
  30.             android:singleLine="true" 
  31.             android:ellipsize="marquee" 
  32.             android:text="Simple application that shows how to use RelativeLayout" /> 
  33.              
  34.     </LinearLayout></LinearLayout> 

而用RelativeLayout實現(xiàn)代碼如下:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="fill_parent" 
  3.     android:layout_height="?android:attr/listPreferredItemHeight" 
  4.     android:padding="6dip"
  5.      
  6.     <ImageView 
  7.         android:id="@+id/icon" 
  8.         android:layout_width="wrap_content" 
  9.         android:layout_height="fill_parent" 
  10.         android:layout_alignParentTop="true" 
  11.         android:layout_alignParentBottom="true" 
  12.         android:layout_marginRight="6dip" 
  13.         android:src="@drawable/icon" /> 
  14.  
  15.     <TextView   
  16.         android:id="@+id/secondLine" 
  17.         android:layout_width="fill_parent" 
  18.         android:layout_height="26dip"  
  19.         android:layout_toRightOf="@id/icon" 
  20.         android:layout_alignParentBottom="true" 
  21.         android:layout_alignParentRight="true" 
  22.         android:singleLine="true" 
  23.         android:ellipsize="marquee" 
  24.         android:text="Simple application that shows how to use RelativeLayout" /> 
  25.  
  26.     <TextView 
  27.         android:layout_width="fill_parent" 
  28.         android:layout_height="wrap_content" 
  29.         android:layout_toRightOf="@id/icon" 
  30.         android:layout_alignParentRight="true" 
  31.         android:layout_alignParentTop="true" 
  32.         android:layout_above="@id/secondLine" 
  33.         android:layout_alignWithParentIfMissing="true" 
  34.         android:gravity="center_vertical" 
  35.         android:text="My Application" /></RelativeLayout> 

可以看到用RelativeLayout實現(xiàn),布局層次明顯少了,所以大多數(shù)時候優(yōu)先推薦使用RelativeLayout。

 

查看布局層次

如何查看布局層次呢?有兩種辦法:一是通過手機的開 發(fā)者選項,4.0及以上Android版本可通過設(shè)置->開發(fā)者選項->顯示布局邊界打開頁面布局顯示,看看是否有不必要的節(jié)點和嵌套。第二 種就是利用SDK自帶的UI性能檢測工具HierarchyViewer。 進入sdk目錄下的tools文件夾下,找到HierarchyViewer并運行(此時保持你的模擬器或真機正在運行需要進行分析的App),雙擊我們 正在顯示的這個App所代表的進程。接下來便會進入hierarchyviewer的界面,我們可以在這里很清晰看到正在運行的UI的布局層次結(jié)構(gòu)以及它 們之間的關(guān)系。大概的顯示如下圖:

通過布局圖我們可以看到根節(jié)點DecorView下 包含一個LinearLayout, 這個LinearLayout就是包含Activity布局和狀態(tài)欄的整個屏幕顯示的布局父節(jié)點,這個LinearLayout有兩個子節(jié)點, 一個是FrameLayout, FrameLayout就是Activity布局中默認的父布局節(jié)點, 這個節(jié)點下面就包含了我們自己寫的xml布局, 還有一個子節(jié)點就是ViewStub,關(guān)于這個節(jié)點我們在后面會詳細介紹。

 

< include />的使用

在實際開發(fā)中,我們經(jīng)常會遇到一些共用的UI組件, 比如帶返回按鈕的導航欄,如果為每一個xml文件都設(shè)置這部分布局,一是重復的工作量大,二是如果有變更,那么每一個xml文件都得修改。還 好,Android為我們提供了include標簽,顧名思義,通過它,我們可以將這些共用的組件抽取出來單獨放到一個xml文件中,然后使用 include標簽導入共用布局,這樣,前面提到的兩個問題都解決了。下面以在一個布局main.xml中用include引入另一個布局 header.xml為例。

header.xml文件

  1. <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="match_parent" 
  3.     android:layout_height="match_parent" > 
  4.  
  5.     <Button 
  6.         android:id="@+id/button" 
  7.         android:layout_width="match_parent" 
  8.         android:layout_height="@dimen/dp_40" 
  9.         android:layout_above="@+id/text"/> 
  10.  
  11.     <TextView 
  12.         android:id="@+id/text" 
  13.         android:layout_width="match_parent" 
  14.         android:layout_height="@dimen/dp_40" 
  15.         android:layout_alignParentBottom="true" 
  16.         android:text="@string/app_name" /></RelativeLayout> 

然后我們在需要引入footer的布局xml中通過include導入這個共用布局。

main.xml文件

  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="match_parent" 
  3.     android:layout_height="match_parent"
  4.  
  5.     <TextView 
  6.         android:layout_width="match_parent" 
  7.         android:layout_height="wrap_content" 
  8.         android:text="hello world" /> 
  9.  
  10.     <RelativeLayout  
  11.         android:layout_width="match_parent" 
  12.         android:layout_height="match_parent" 
  13.         android:layout_gravity="center" > 
  14.  
  15.         <include layout="@layout/header" /> 
  16.  
  17.     </RelativeLayout></FrameLayout> 

通過這種方式,我們既能提高UI的制作和復用效率,也能保證制作的UI布局更加規(guī)整和易維護。

 

< merge />的使用

merge標簽的作用是合并UI布局,使用該標簽能降低UI布局的嵌套層次。merge標簽可用于兩種典型情況:

  • 布局根結(jié)點是FrameLayout且不需要設(shè)置background或padding等屬性,可以用merge代替,因為Activity內(nèi)容布局的parent view就是個FrameLayout,所以可以用merge消除只剩一個,這一點可以從上圖中看到。

  • 某布局作為子布局被其他布局include時,使用merge當作該布局的頂節(jié)點,這樣在被引入時頂結(jié)點會自動被忽略,而將其子節(jié)點全部合并到主布局中。

以***種情況為例,main.xml布局就可以優(yōu)化如下:

  1. merge xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="match_parent" 
  3.     android:layout_height="match_parent"
  4.  
  5.     <FrameLayout  
  6.         android:layout_width="match_parent" 
  7.         android:layout_height="match_parent"
  8.  
  9.         <TextView 
  10.             android:layout_width="match_parent" 
  11.             android:layout_height="wrap_content" 
  12.             android:text="hello world" /> 
  13.  
  14.         <RelativeLayout  
  15.             android:layout_width="match_parent" 
  16.             android:layout_height="match_parent" 
  17.             android:layout_gravity="center" > 
  18.  
  19.             <include layout="@layout/header" /> 
  20.  
  21.         </RelativeLayout> 
  22.     </FrameLayout></merge> 

以第二種情況為例,header.xml布局可以優(yōu)化如下:

  1. <?xml version="1.0" encoding="utf-8"?><merge xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="match_parent" 
  3.     android:layout_height="match_parent" > 
  4.   
  5.     <Button 
  6.         android:id="@+id/button" 
  7.         android:layout_width="match_parent" 
  8.         android:layout_height="@dimen/dp_40" 
  9.         android:layout_above="@+id/text"/> 
  10.   
  11.     <TextView 
  12.         android:id="@+id/text" 
  13.         android:layout_width="match_parent" 
  14.         android:layout_height="@dimen/dp_40" 
  15.         android:layout_alignParentBottom="true" 
  16.         android:text="@string/app_name" /> 
  17.  </merge> 

這樣就不會有多余的FrameLayout和RelativeLayout節(jié)點了。

 

ViewStub標簽

viewstub標簽同include標簽一樣可以 用來引入一個外部布局,不同的是,viewstub引入的布局默認不會擴張,即既不會占用顯示也不會占用位置,從而在解析layout時節(jié)省cpu和內(nèi) 存。 viewstub常用來引入那些默認不會顯示,只在特殊情況下顯示的布局,如進度布局、網(wǎng)絡(luò)失敗顯示的刷新布局、信息出錯出現(xiàn)的提示布局等。

我們新建一個xml文件用來顯示一個網(wǎng)絡(luò)錯誤時提示信息error.xml:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     android:layout_width="wrap_content" 
  4.     android:layout_height="wrap_content" > 
  5.  
  6.    <TextView 
  7.         android:layout_width="wrap_content" 
  8.         android:layout_height="wrap_content" 
  9.         android:layout_centerInParent="true" 
  10.         android:background="@android:color/white" 
  11.         android:padding="10dip" 
  12.         android:text="Message" 
  13.         android:textColor="@android:color/black" /></RelativeLayout 

然后在main.xml里面加入ViewStub的標簽引入上面的布局:

  1. <merge xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     android:layout_width="match_parent" 
  4.     android:background="@android:color/darker_gray" 
  5.     android:layout_height="match_parent" > 
  6.  
  7.     ...    <ViewStub 
  8.         android:id="@+id/error_layout" 
  9.         android:layout_width="wrap_content" 
  10.         android:layout_height="wrap_content" 
  11.         android:layout_gravity="center" 
  12.         android:layout="@layout/error" /></merge> 

在java中通過(ViewStub)findViewById(id)找到ViewStub,通過stub.inflate()展開ViewStub,然后得到子View,如下:

  1. private View errorView; 
  2.  private void showError() { 
  3.     // not repeated infalte 
  4.     if (errorView != null) { 
  5.         errorView.setVisibility(View.VISIBLE); 
  6.         return
  7.     } 
  8.   
  9.     ViewStub stub = (ViewStub)findViewById(R.id.error_layout); 
  10.     errorView = stub.inflate();} 
  11.  private void showContent() { 
  12.     if (errorView != null) { 
  13.         errorView.setVisibility(View.GONE); 
  14.     }} 

在上面showError()中展開了ViewStub,同時我們對errorView進行了保存,這樣下次不用繼續(xù)inflate。

 

總結(jié)

這篇Blog沒有詳細介紹 HierarchyViewer工具的使用,相信如果對布局原則比較熟練之后,對工具的依賴大大減少,開發(fā)效率也會大大的提升。除這些布局原則之外,還需 要大家對Android各個組件的屬性很熟悉,比如如果要做這么一個布局, 一個圖片和一個文本的布局,新手們往往會用一個Layout嵌套ImageView和TextView來做, 但是當我們知道TextView有drawableLeft, drawableRight等屬性時,那么實現(xiàn)這樣的一個布局是非常快速高效的。總之,且學且實踐!

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

2012-05-08 16:37:23

android

2013-09-17 10:17:39

Android布局

2011-03-24 09:03:13

Android SDKAndroid

2023-08-25 08:06:04

項目布局LazyRow?

2009-12-31 15:21:48

Silverlight

2011-05-31 09:36:46

Android 布局屬性

2017-05-11 15:01:43

Androidweb布局

2021-07-29 14:20:34

網(wǎng)絡(luò)優(yōu)化移動互聯(lián)網(wǎng)數(shù)據(jù)存儲

2016-09-22 09:24:33

AndroidViewStub

2014-09-05 10:10:32

Android自適應布局設(shè)計

2011-04-07 08:59:47

Android交互設(shè)計

2019-12-13 10:25:08

Android性能優(yōu)化啟動優(yōu)化

2019-07-25 13:22:43

AndroidAPK文件優(yōu)化

2013-09-16 15:16:20

Android性能優(yōu)化

2013-03-27 09:17:17

Android開發(fā)AndroidList

2013-09-17 10:32:08

Android性能優(yōu)化數(shù)據(jù)庫

2012-05-14 21:08:47

Android頁面布局

2010-01-28 11:18:14

Android界面布局

2011-04-22 11:01:36

框架布局界面設(shè)計Android

2011-04-11 17:25:30

線性布局用戶界面設(shè)計Android
點贊
收藏

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

色呦呦视频在线观看| 国产日产高清欧美一区二区三区| 日韩午夜激情视频| 国产福利电影在线播放| 亚洲香蕉av在线一区二区三区| 成人免费看黄| 欧美激情手机在线视频 | 欧美精选一区| 日本午夜精品一区二区| 老妇喷水一区二区三区| 亚洲国产精品无码观看久久| 国产精品久久久久婷婷| 在线麻豆国产传媒1国产免费| 欧美日韩一区在线观看| 91tv亚洲精品香蕉国产一区| 国产999在线| 久久国产主播| 九九视频精品在线观看| 国产在线观看免费一区| 亚洲精品一级二级| 欧美成人激情在线| 香蕉久久久久久| 国产亚洲激情在线| 国内精品伊人| 亚洲成av人影院在线观看网| 可以在线观看的黄色| 亚洲欧美日韩一区在线| 女人av一区| 中文字幕剧情在线观看一区| 国产精品久久久久久福利一牛影视 | 国产精品视频你懂的| 黄色av免费在线看| 色琪琪综合男人的天堂aⅴ视频| 成人在线免费小视频| 日韩视频在线观看视频| 亚洲成a天堂v人片| 欧美日韩尤物久久| 精品国产一区二区三区麻豆小说 | 欧洲在线视频一区| 中文字幕一区二区三区四区不卡| sm国产在线调教视频| 性金发美女69hd大尺寸| 日本不卡中文字幕| 在线观看av每日更新免费| 中文字幕在线日韩| 亚洲综合99| 中文字幕视频在线免费| 毛片精品免费在线观看| 日韩经典中文字幕一区| 成年人在线播放| www日韩欧美| 久久国产精品99国产| 日日噜噜噜夜夜爽爽狠狠视频 | 欧美日韩一区二区在线免费观看 | 国产福利视频在线播放| 精品对白一区国产伦| 国产韩国精品一区二区三区| 蜜臀av午夜一区二区三区| 日韩欧美一级二级三级久久久| 成人网18免费网站| 欧美视频第一区| 亚洲欧美综合区自拍另类| 激情亚洲网站| 成视频在线免费观看| 欧美极品美女视频网站在线观看免费 | 成人免费在线播放| 日本男人操女人| 国产一区二区三区欧美| 久久精品30| av大全在线免费看| 日本91av在线播放| 国产日韩综合av| 成人亚洲免费| 大地资源网在线观看免费官网| 欧美日韩国产精品自在自线| 日韩a一区二区| 男女视频网站免费观看| 国语自产精品视频在线看| 99久久精品情趣| 久久婷婷五月综合色丁香| 亚洲乱码日产精品bd在线观看| 亚洲激情中文字幕| 国产又粗又猛又爽又黄91精品| 蜜桃传媒在线观看免费进入| 日产精品久久久一区二区| 欧美一区二区三区四区高清 | 99riav一区二区三区| 中文字幕在线视频区| 久久全球大尺度高清视频| 久久综合中文字幕| 免费黄网在线观看| 不卡视频一区二区三区| 精品成人在线视频| 欧美xxav| 欧美日韩视频精品二区| 成人福利视频网| 午夜精品在线视频一区| blacked蜜桃精品一区| 国产成免费视频| 欧美一区二区三区…… | 精品久久久久久无| 久久国产成人| 欧美日韩在线视频免费观看| 日本一区二区三区四区高清视频| 欧美日韩国产大片| 亚洲国产综合在线看不卡| h视频在线观看免费| 国产精品污www一区二区三区| 欧美图片一区二区三区| 夜夜夜久久久| 国内在线免费视频| 日本男女交配视频| 欧美黑人又粗大| 亚洲欧美日本在线| 香港欧美日韩三级黄色一级电影网站| 性色av一区| 国产精品国产精品国产专区蜜臀ah| 欧美日韩大陆在线| 日本aⅴ精品一区二区三区| 欧美电影免费观看高清完整| 国产精品wwwww| 国产一区玩具在线观看| 欧美一区二区三区啪啪| 久草在线在线精品观看| 高清一区二区中文字幕| 国产传媒视频在线观看| 激情视频在线观看一区二区三区| 日韩av在线一区二区| 国产婷婷一区二区| 日本精品三区| 影音先锋中文在线视频| 热99这里只有精品| 国产91网红主播在线观看| 欧美视频在线一区| 狠狠色狠狠色综合日日91app| 玖玖精品一区| 在线观看国产视频| 在线无限看免费粉色视频| 久久久久久国产三级电影| 日本精品视频一区二区| 国产在线精品一区二区夜色| 红杏成人性视频免费看| 久久久久久青草| 日韩小视频网站| 国产精品日韩在线| 亚洲国产精品成人av| 亚洲国产精品t66y| 亚洲精品孕妇| 日本一区二区三区视频在线看| 亚洲成人男人天堂| 久久男人资源站| 91久久久久久久| 日韩中文娱乐网| 色成人在线视频| 91免费视频网| 国产一区二区三区成人欧美日韩在线观看| 欧洲美女精品免费观看视频 | 欧美日韩精品一区二区三区蜜桃| 国产成人免费av在线| 国产真实乱子伦精品视频| 夜色福利资源站www国产在线视频| 日韩电影免费观看在| 欧美国产亚洲精品久久久8v| 欧美日韩国产美| 国产精品国产三级国产a| 亚洲欧美日本日韩| 久久99国产精一区二区三区| 麻豆国产在线| 牛牛热在线视频| 亚洲xxxx2d动漫1| 国产精品av免费| 97se国产在线视频| 欧美日韩999| 亚洲国产精品va在线| 午夜国产不卡在线观看视频| www.亚洲人| 免费高清在线视频一区·| 国产精品7m凸凹视频分类| 亚洲91网站| 美女一区网站| 黄色av免费在线| 亚洲成人男人天堂| 四虎最新地址发布| 一区二区传媒有限公司| 欧美日韩精品免费看| 91久久久久久久久久久久久| 欧美国产在线电影| 亚洲精品综合精品自拍| 3atv在线一区二区三区| 午夜视频在线观看一区二区| 久久精品在线免费观看| 国产一区二区三区免费| 亚洲在线黄色| 欧美在线高清| 清纯唯美日韩| 无码少妇一区二区三区| 国产一区二区三区国产精品| 亚洲一区资源| 激情在线视频播放| av在线free|