public class CoordinatorLayout extends ViewGroup implements NestedScrollingParent2
建立依賴
onMeasure-》prepareChildren-》dependsOn-》layoutDependsOn
測量的第一步就是確定依賴關系
prepareChildren中getResolvedLayoutParams找到支持behavior的節(jié)點,然后找出互相依賴關系(2個for掃描所有節(jié)點,兩兩對比),結果加入緩存列表
layoutDependsOn被子類覆蓋,只需要對dependency判斷返回成功,就建立依賴
視圖改變
onNestedScroll-》onChildViewsChanged-》onDependentViewChanged
child的ontouch事件里有對parent的調用
behavior實例化parseBehavior內,ThreadLocal<Map<String, Constructor<Behavior>>>存放構造函數(shù),用反射獲取構造緩存
補充androidx.core.util.Pools
private final Object[] mPool;//默認的存儲數(shù)組
private int mPoolSize;//當前剩余容量計數(shù)器
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的值,但是存入到數(shù)組內,不釋放引用,這樣就是緩存了新建過程。