2019-11-20 自定義View 筆記

1.MeasureSpec的原理?
答:MeasureSpec封裝了從父級(jí)傳遞給子級(jí)的布局需求。每個(gè)MeasureSpec代表了寬度或高度的要求。MeasureSpec實(shí)現(xiàn)為32位的int,由size和mode組成,高2位代表mode,低30位代表size,通過(guò)將mode和size打包成一個(gè)int值來(lái)減少對(duì)象內(nèi)存分配,并提供打包和解包的方法。
MeasureSpec計(jì)算規(guī)則

2.ViewPager populate 源碼時(shí)序圖
首先 在ViewPager源碼中可以看到 populate 是在onMeasure中被調(diào)用,在Populate函數(shù)中可以看到
① mAdapter.startUpdate(this);
ViewPager開(kāi)始填充item,調(diào)用startUpdate;
②填充可用寬度的3倍或不超過(guò)屏幕外的數(shù)量
③調(diào)用了addNewItem()來(lái)添加新的item

  if (curItem == null && N > 0) {
          //添加新的Item
            curItem = addNewItem(mCurItem, curIndex);
        }

在addNewItem方法中可以看到, 適配器負(fù)責(zé)將視圖添加到給定的容器中

mAdapter.instantiateItem(this, position)。

④接著在Populate函數(shù)繼續(xù)往下看,會(huì)發(fā)現(xiàn)適配器調(diào)用了destroy

mAdapter.destroyItem(this, pos, ii.object);

銷毀item。
⑤calculatePageOffsets(curItem, curIndex, oldCurInfo);
計(jì)算頁(yè)面偏移量
⑥mAdapter.setPrimaryItem(this, mCurItem, curItem.object);
通知適配器當(dāng)前將哪個(gè)item顯示為當(dāng)前頁(yè)面
7?? mAdapter.finishUpdate(this); 結(jié)束更新
所以ViewPager無(wú)論存在多少個(gè)item,都不會(huì)內(nèi)存溢出,一直在創(chuàng)建和銷毀。
使用ViewPager顯示輪播頁(yè)面,默認(rèn)顯示當(dāng)前頁(yè)面,緩存左右兩個(gè)頁(yè)面,如果左右都有頁(yè)面,往右滑動(dòng),當(dāng)前頁(yè)面變?yōu)樽钭髠?cè)頁(yè)面,進(jìn)行緩存,之前最左側(cè)頁(yè)面被銷毀,最右側(cè)頁(yè)面顯示為當(dāng)前頁(yè)面;如果往左滑動(dòng),則相反之。
如圖:


image.png

3.ViewPager + Fragment 緩存原理
由于ViewPager預(yù)加載緩存機(jī)制,每次緩存3個(gè),如果之前有就不會(huì)重新創(chuàng)建,也不會(huì)走其生命周期。

4.懶加載
懶加載的時(shí)機(jī):onCreateView()加載完畢,setUserVisibleHint()返回true,才可以進(jìn)行加載數(shù)據(jù)。
設(shè)置兩個(gè)bool 類型變量,一個(gè)isFirstVisible,一個(gè)isFragmentVisible,在onActivityCreated()和setUserVisibleHint()處理,全部為true

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容