欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android使用ViewStub實現(xiàn)布局優(yōu)化方法示例

 更新時間:2022年08月26日 10:40:10   作者:芝麻粒兒  
這篇文章主要為大家介紹了Android使用ViewStub實現(xiàn)布局優(yōu)化方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

??實踐過程

Hello,大家好啊,我是小空,今天帶大家了解下動態(tài)加載控件ViewStub。

在平時開發(fā)中經(jīng)常會遇到復(fù)雜布局,而每一個view都是會占據(jù)內(nèi)存和消耗cpu的(即使再小,累計成多,一般嵌套7級以上就有明顯的卡頓了),布局優(yōu)化就是我們常做的任務(wù)之一,甚至是一塊心病。所以我們工作中就要留意布局優(yōu)化的手段,ViewStub就是其中之一。

大家應(yīng)該聽過merge標(biāo)簽,將某個布局文件的根布局寫成merge的,然后對應(yīng)的布局include引用,會默認(rèn)不會引入merge幫我們減少一層嵌套。而ViewStub也是類似的實現(xiàn),區(qū)別在于include的merge就已經(jīng)在view的樹結(jié)構(gòu)中了,而viewstub默認(rèn)沒在樹中,只有代碼調(diào)用初始化的時候才會進(jìn)入樹中。

就好比我們排隊,前者是兩人同時排隊,后者是一個人排隊拿著個占位的牌子幫另一人占位,等合適的時機再將另一個人插入進(jìn)來,牌子拿開。

??實現(xiàn)方式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <Button
       android:id="@+id/idBtnInflate"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="inflate" />
    <ViewStub
        android:id="@+id/viewStubName"
        android:inflatedId="@+id/inflatedLayoutName"
        android:layout="@layout/yourLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

布局中ViewStub其實就是個寬高全是0的View,它默認(rèn)是不可見的(不是GONE或INVISIBLE的不可見,而是根本沒在view的樹結(jié)構(gòu)里),然后通過調(diào)用setVisibility函數(shù)或者Inflate函數(shù)會將我們的目標(biāo)布局給加載出來,這樣就實現(xiàn)了延遲加載的效果。

idBtnInflate.setOnClickListener{
    viewStubName. inflate()
    //或者是下面的形式加載,因為里面會執(zhí)行inflate
    // viewStubName.visibility=View.VISIBLE
}

??知識點

注意,viewstub執(zhí)行inflate函數(shù)后,在當(dāng)前頁面activity未銷毀之前無法進(jìn)行第二次inflate。

為什么第二次inflate的時候會報錯呢?仔細(xì)看上面列舉的排隊比喻,viewstud就是占位的那個牌子,當(dāng)你引入的layout插進(jìn)去后就會移除viewstub控件。那么下次你再進(jìn)行inflate的時候自然就是報錯了。

為什么大小為0且不繪制? 我們找到ViewStub的源碼:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(0, 0);
}
@Override
public void draw(Canvas canvas) {
}
@Override
protected void dispatchDraw(Canvas canvas) {
}
public void setWillNotDraw(boolean willNotDraw) {
    setFlags(willNotDraw ? WILL_NOT_DRAW : 0, DRAW_MASK);
}

重寫draw和dispatchDraw,但卻什么也不寫,再接著onMeasure中進(jìn)行setMeasuredDimension(0,0);就實現(xiàn)了寬高為0.

而不繪制是將view的Flags設(shè)置為了WILL_NOT_DRAW,這個值的作用是view不會進(jìn)行onDraw方法。

順便一提:在當(dāng)下設(shè)備性能越來越好的背景下,關(guān)于優(yōu)化的事情放在開發(fā)周期后面再說吧。先出產(chǎn)品再迭代。隨著經(jīng)驗的積累,正常開發(fā)你也會留意性能優(yōu)化,隨手就解決了。

以上就是Android使用ViewStub實現(xiàn)布局優(yōu)化方法示例的詳細(xì)內(nèi)容,更多關(guān)于Android ViewStub布局優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論