Android使用ViewStub實現佈局優化方法示例
👉實踐過程
Hello,大傢好啊,我是小空,今天帶大傢瞭解下動態加載控件ViewStub。
在平時開發中經常會遇到復雜佈局,而每一個view都是會占據內存和消耗cpu的(即使再小,累計成多,一般嵌套7級以上就有明顯的卡頓瞭),佈局優化就是我們常做的任務之一,甚至是一塊心病。所以我們工作中就要留意佈局優化的手段,ViewStub就是其中之一。
大傢應該聽過merge標簽,將某個佈局文件的根佈局寫成merge的,然後對應的佈局include引用,會默認不會引入merge幫我們減少一層嵌套。而ViewStub也是類似的實現,區別在於include的merge就已經在view的樹結構中瞭,而viewstub默認沒在樹中,隻有代碼調用初始化的時候才會進入樹中。
就好比我們排隊,前者是兩人同時排隊,後者是一個人排隊拿著個占位的牌子幫另一人占位,等合適的時機再將另一個人插入進來,牌子拿開。
😜實現方式
<?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,它默認是不可見的(不是GONE或INVISIBLE的不可見,而是根本沒在view的樹結構裡),然後通過調用setVisibility函數或者Inflate函數會將我們的目標佈局給加載出來,這樣就實現瞭延遲加載的效果。
idBtnInflate.setOnClickListener{ viewStubName. inflate() //或者是下面的形式加載,因為裡面會執行inflate // viewStubName.visibility=View.VISIBLE }
😜知識點
註意,viewstub執行inflate函數後,在當前頁面activity未銷毀之前無法進行第二次inflate。
為什麼第二次inflate的時候會報錯呢?仔細看上面列舉的排隊比喻,viewstud就是占位的那個牌子,當你引入的layout插進去後就會移除viewstub控件。那麼下次你再進行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中進行setMeasuredDimension(0,0);就實現瞭寬高為0.
而不繪制是將view的Flags設置為瞭WILL_NOT_DRAW,這個值的作用是view不會進行onDraw方法。
順便一提:在當下設備性能越來越好的背景下,關於優化的事情放在開發周期後面再說吧。先出產品再迭代。隨著經驗的積累,正常開發你也會留意性能優化,隨手就解決瞭。
以上就是Android使用ViewStub實現佈局優化方法示例的詳細內容,更多關於Android ViewStub佈局優化的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Androd 勇闖高階性能優化之佈局優化篇
- Android ViewStub使用方法學習
- Android自定義有限制區域圖例角度自識別塗鴉工具類中篇
- Android使用setContentView實現頁面的轉換效果
- Android實現背景圖片輪播