美文网首页
CoordinatorLayout分析

CoordinatorLayout分析

作者: 水清波 | 来源:发表于2019-05-07 16:59 被阅读0次

    public class CoordinatorLayout extends ViewGroup implements NestedScrollingParent2

    建立依赖

    onMeasure-》prepareChildren-》dependsOn-》layoutDependsOn
    测量的第一步就是确定依赖关系
    prepareChildren中getResolvedLayoutParams找到支持behavior的节点,然后找出互相依赖关系(2个for扫描所有节点,两两对比),结果加入缓存列表
    layoutDependsOn被子类覆盖,只需要对dependency判断返回成功,就建立依赖

    视图改变

    onNestedScroll-》onChildViewsChanged-》onDependentViewChanged

    child的ontouch事件里有对parent的调用

    behavior实例化parseBehavior内,ThreadLocal<Map<String, Constructor<Behavior>>>存放构造函数,用反射获取构造缓存

    补充androidx.core.util.Pools

    private final Object[] mPool;//默认的存储数组
    private int mPoolSize;//当前剩余容量计数器

    public T acquire() {
                if (mPoolSize > 0) {
                    final int lastPooledIndex = mPoolSize - 1;
                    T instance = (T) mPool[lastPooledIndex];
                    mPool[lastPooledIndex] = null;
                    mPoolSize--;
                    return instance;
                }
                return null;
            }
    private static Rect acquireTempRect() {
            Rect rect = sRectPool.acquire();
            if (rect == null) {
                rect = new Rect();
            }
            return rect;
        }
     public boolean release(@NonNull T instance) {
                if (isInPool(instance)) {
                    throw new IllegalStateException("Already in the pool!");
                }
                if (mPoolSize < mPool.length) {
                    mPool[mPoolSize] = instance;
                    mPoolSize++;
                    return true;
                }
                return false;
            }
    
            private boolean isInPool(@NonNull T instance) {
                for (int i = 0; i < mPoolSize; i++) {
                    if (mPool[i] == instance) {
                        return true;
                    }
                }
                return false;
            }
    private static void releaseTempRect(@NonNull Rect rect) {
            rect.setEmpty();
            sRectPool.release(rect);
        }
    

    总是从末尾获得引用,引用赋值后使用,释放时清空rect的值,但是存入到数组内,不释放引用,这样就是缓存了新建过程。

    相关文章

      网友评论

          本文标题:CoordinatorLayout分析

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