美文网首页
2019-11-20 自定义View 笔记

2019-11-20 自定义View 笔记

作者: hua_dm | 来源:发表于2019-11-21 11:08 被阅读0次

    1.MeasureSpec的原理?
    答:MeasureSpec封装了从父级传递给子级的布局需求。每个MeasureSpec代表了宽度或高度的要求。MeasureSpec实现为32位的int,由size和mode组成,高2位代表mode,低30位代表size,通过将mode和size打包成一个int值来减少对象内存分配,并提供打包和解包的方法。
    MeasureSpec计算规则

    2.ViewPager populate 源码时序图
    首先 在ViewPager源码中可以看到 populate 是在onMeasure中被调用,在Populate函数中可以看到
    ① mAdapter.startUpdate(this);
    ViewPager开始填充item,调用startUpdate;
    ②填充可用宽度的3倍或不超过屏幕外的数量
    ③调用了addNewItem()来添加新的item

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

    在addNewItem方法中可以看到, 适配器负责将视图添加到给定的容器中

    mAdapter.instantiateItem(this, position)。
    

    ④接着在Populate函数继续往下看,会发现适配器调用了destroy

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

    销毁item。
    ⑤calculatePageOffsets(curItem, curIndex, oldCurInfo);
    计算页面偏移量
    ⑥mAdapter.setPrimaryItem(this, mCurItem, curItem.object);
    通知适配器当前将哪个item显示为当前页面
    7️⃣ mAdapter.finishUpdate(this); 结束更新
    所以ViewPager无论存在多少个item,都不会内存溢出,一直在创建和销毁。
    使用ViewPager显示轮播页面,默认显示当前页面,缓存左右两个页面,如果左右都有页面,往右滑动,当前页面变为最左侧页面,进行缓存,之前最左侧页面被销毁,最右侧页面显示为当前页面;如果往左滑动,则相反之。
    如图:


    image.png

    3.ViewPager + Fragment 缓存原理
    由于ViewPager预加载缓存机制,每次缓存3个,如果之前有就不会重新创建,也不会走其生命周期。

    4.懒加载
    懒加载的时机:onCreateView()加载完毕,setUserVisibleHint()返回true,才可以进行加载数据。
    设置两个bool 类型变量,一个isFirstVisible,一个isFragmentVisible,在onActivityCreated()和setUserVisibleHint()处理,全部为true

    相关文章

      网友评论

          本文标题:2019-11-20 自定义View 笔记

          本文链接:https://www.haomeiwen.com/subject/gwfoictx.html