Android 性能優(yōu)化筆記 一 布局優(yōu)化

一脓恕、使用<include>標(biāo)簽重用布局

eg:一個(gè)公用的布局common.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#ccc"
 android:layout_height="50dp">
  <TextView
android:layout_centerInParent="true"
 android:textSize="16sp"
  android:text="標(biāo)題"
 android:layout_width="wrap_content"
android:layout_height="wrap_content" />
        </RelativeLayout>

在需要重用此布局的地方

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mh.demoperformance.MainActivity">
 <include layout="@layout/common"/>
      </RelativeLayout>

效果圖


2376856-60e54112922a0ce6.png

使用include 引入一個(gè)布局文件匾灶,include標(biāo)簽除了可以指定id之外,
只能使用android:layout_開(kāi)頭的屬性谎势,而且只要
指定了android:layout_這種屬性就必須要寫
上android:layout_height和android:layout_width,否者
其他的android:layout_屬性都無(wú)效,一旦在include 中
指定了android:layout_height和android:layout_width之
后,被include 進(jìn)來(lái)的布局的根元素的android:layout_height和
android:layout_width將無(wú)效,寬高將和include里面的保持一致汰扭,
修改布局后:

<?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.mh.demoperformance.MainActivity">
            <include
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                layout="@layout/common"/>

        </RelativeLayout>

效果圖

2376856-0e67b6bed6ca2249.png

同理如果include 里面寫了id標(biāo)簽,被include 的布局的根元素
也指定了id標(biāo)簽福铅,那么將以inclide的id標(biāo)簽為準(zhǔn)

二萝毛、使用<merge>標(biāo)簽合并布局

一般在使用<include>標(biāo)簽的時(shí)候會(huì)引入多余的嵌套布局,
比如在上面的例子中滑黔,布局和被嵌套的布局的最外層都
使用了RelativeLayout,所以被嵌套的布局的RelativeLayout是
多余的笆包,所以<merge>標(biāo)簽一般和<include>標(biāo)簽一起使用
來(lái)減少布局層級(jí)修改common.xml布局

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_centerInParent="true"
 android:textSize="16sp"
android:text="標(biāo)題"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</merge>

這樣就去除了多余的RelativeLayout 布局嵌套
merge的一些特性:

  1. merge必須放在布局文件的根節(jié)點(diǎn)上。
  2. merge并不是一個(gè)View略荡,只是聲明了一些視圖庵佣,等待被添加。
    所以對(duì)merge標(biāo)簽設(shè)置的所有屬性都是無(wú)效的汛兜。如果通
    過(guò)LayoutInflate.inflate方法渲染秧了, 第二個(gè)參數(shù)必須指定
    一個(gè)父容器,且第三個(gè)參數(shù)必須為true序无。
    貼一篇作者 江南一點(diǎn)雨 LayoutInflate.inflate的文章
    (http://blog.csdn.net/u012702547/article/details/52628453)
  3. 如果Activity的布局根節(jié)點(diǎn)是FrameLayout验毡,可以替換
    為merge標(biāo)簽,這樣執(zhí)行setContentView之后帝嗡,會(huì)減少
    一層FrameLayout節(jié)點(diǎn)晶通。
三、使用<ViewStub>按需加載布局

在實(shí)際開(kāi)發(fā)中很多布局我們并不是一開(kāi)始就需要加載的
哟玷,通常我們可以使用顯示和隱藏來(lái)實(shí)現(xiàn)狮辽。但是這樣
隱藏的布局在一開(kāi)始的時(shí)候就已經(jīng)參與繪制了,
會(huì)影響繪制的效率巢寡。而VIewStub本事繼承了View,
它的寬和高都是0喉脖,自身并不參與繪制。當(dāng)我們需要
顯示的時(shí)候才去加載進(jìn)來(lái)抑月,能提高程序的初始化性能树叽。

一個(gè)需要按需加載的布局文件viewstub.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:textSize="16sp"
 android:text="點(diǎn)擊重新加載"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
 </RelativeLayout>

main.xml文件

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
 android:layout_height="match_parent"
android:background="#ccc"
tools:context="com.mh.demoperformance.MainActivity">
<ViewStub
 android:layout_centerInParent="true"
 android:id="@+id/viewstub"
 android:layout="@layout/common"
android:layout_width="wrap_content"
 android:layout_height="wrap_content" />
        </RelativeLayout>

在需要顯示的時(shí)候

ViewStub viewStub = (ViewStub) findViewById(R.id.viewstub);
 viewStub.inflate();

或者

 mViewStub = (ViewStub) findViewById(R.id.viewstub);
        mViewStub.setVisibility(View.VISIBLE);

當(dāng)調(diào)用infalte或者ViewStub.setVisibility(View.VISIBLE);時(shí),
先從父視圖上把當(dāng)前ViewStub刪除谦絮,再把加載的android:layotu視圖添加上

四题诵、LinearLayout增加divider分割線

如果我們要給LinearLayout 添加如下圖的分割線洁仗,通常我們可以
在每一項(xiàng)中間添加一個(gè)View,設(shè)置view的寬高性锭,和背景赠潦,
但是這樣不僅浪費(fèi)資源而且還繁瑣,
在android3.0及后面的版本給LinearLayout添加分割線我們可以這樣做:
1)在drawable文件下新建shape_divider.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#e70303" />
    <size android:height="1dp" />
</shape>

2)在LinearLayout中添加

android:showDividers="middle"
android:divider="@drawable/shape_divider"

效果圖


2376856-5a81e6867eb1e694.png

這樣便能實(shí)現(xiàn)上圖中效果草冈。android:divider="@drawable"中的drawable也可以是圖片文件她奥,
修改android:divider="@drawable/shape_divider"為android:divider="@drawable/pic" ,
pic是一張圖片怎棱。效果如下圖


2376856-36aa733f0b14ebe9.png

showDividers 一共有下面幾個(gè)參數(shù)值可選 middle|end|beginning|none
middle -- 在每一項(xiàng)中間添加分割線

end -- 在整體的最后一項(xiàng)添加分割線
beginning -- 在整體的最上方添加分割線
none -- 無(wú)

五哩俭、Space占位

Space控件在布局中只占位置,而不去繪制渲染蹄殃。
組件中的間隙用Space控件填充比用其它控件
填充可以提高繪制效率携茂。

<android.support.v4.widget.Space
        android:layout_width="match_parent"
        android:layout_height="20dp"/>

占位20dp高

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末你踩,一起剝皮案震驚了整個(gè)濱河市诅岩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌带膜,老刑警劉巖吩谦,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膝藕,居然都是意外死亡式廷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門芭挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)滑废,“玉大人,你說(shuō)我怎么就攤上這事袜爪∪涑茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵辛馆,是天一觀的道長(zhǎng)俺陋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昙篙,這世上最難降的妖魔是什么腊状? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮苔可,結(jié)果婚禮上缴挖,老公的妹妹穿的比我還像新娘。我一直安慰自己焚辅,他們只是感情好醇疼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布硕并。 她就那樣靜靜地躺著,像睡著了一般秧荆。 火紅的嫁衣襯著肌膚如雪倔毙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天乙濒,我揣著相機(jī)與錄音陕赃,去河邊找鬼。 笑死颁股,一個(gè)胖子當(dāng)著我的面吹牛么库,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甘有,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诉儒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了亏掀?” 一聲冷哼從身側(cè)響起忱反,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滤愕,沒(méi)想到半個(gè)月后温算,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡间影,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年注竿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魂贬。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巩割,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出付燥,到底是詐尸還是另有隱情宣谈,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布机蔗,位于F島的核電站蒲祈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏萝嘁。R本人自食惡果不足惜梆掸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牙言。 院中可真熱鬧酸钦,春花似錦、人聲如沸咱枉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至欢伏,卻和暖如春入挣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硝拧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工径筏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人障陶。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓滋恬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抱究。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恢氯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容