ADD week 5
This commit is contained in:
120
02-Easy5/E5/sources/androidx/transition/GhostViewHolder.java
Normal file
120
02-Easy5/E5/sources/androidx/transition/GhostViewHolder.java
Normal file
@@ -0,0 +1,120 @@
|
||||
package androidx.transition;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class GhostViewHolder extends FrameLayout {
|
||||
private boolean mAttached;
|
||||
private ViewGroup mParent;
|
||||
|
||||
GhostViewHolder(ViewGroup viewGroup) {
|
||||
super(viewGroup.getContext());
|
||||
setClipChildren(false);
|
||||
this.mParent = viewGroup;
|
||||
viewGroup.setTag(R.id.ghost_view_holder, this);
|
||||
ViewGroupUtils.getOverlay(this.mParent).add(this);
|
||||
this.mAttached = true;
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void onViewAdded(View view) {
|
||||
if (!this.mAttached) {
|
||||
throw new IllegalStateException("This GhostViewHolder is detached!");
|
||||
}
|
||||
super.onViewAdded(view);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void onViewRemoved(View view) {
|
||||
super.onViewRemoved(view);
|
||||
if ((getChildCount() == 1 && getChildAt(0) == view) || getChildCount() == 0) {
|
||||
this.mParent.setTag(R.id.ghost_view_holder, null);
|
||||
ViewGroupUtils.getOverlay(this.mParent).remove(this);
|
||||
this.mAttached = false;
|
||||
}
|
||||
}
|
||||
|
||||
static GhostViewHolder getHolder(ViewGroup viewGroup) {
|
||||
return (GhostViewHolder) viewGroup.getTag(R.id.ghost_view_holder);
|
||||
}
|
||||
|
||||
void popToOverlayTop() {
|
||||
if (!this.mAttached) {
|
||||
throw new IllegalStateException("This GhostViewHolder is detached!");
|
||||
}
|
||||
ViewGroupUtils.getOverlay(this.mParent).remove(this);
|
||||
ViewGroupUtils.getOverlay(this.mParent).add(this);
|
||||
}
|
||||
|
||||
void addGhostView(GhostViewPort ghostViewPort) {
|
||||
ArrayList<View> arrayList = new ArrayList<>();
|
||||
getParents(ghostViewPort.mView, arrayList);
|
||||
int insertIndex = getInsertIndex(arrayList);
|
||||
if (insertIndex < 0 || insertIndex >= getChildCount()) {
|
||||
addView(ghostViewPort);
|
||||
} else {
|
||||
addView(ghostViewPort, insertIndex);
|
||||
}
|
||||
}
|
||||
|
||||
private int getInsertIndex(ArrayList<View> arrayList) {
|
||||
ArrayList arrayList2 = new ArrayList();
|
||||
int childCount = getChildCount() - 1;
|
||||
int i = 0;
|
||||
while (i <= childCount) {
|
||||
int i2 = (i + childCount) / 2;
|
||||
getParents(((GhostViewPort) getChildAt(i2)).mView, arrayList2);
|
||||
if (isOnTop(arrayList, (ArrayList<View>) arrayList2)) {
|
||||
i = i2 + 1;
|
||||
} else {
|
||||
childCount = i2 - 1;
|
||||
}
|
||||
arrayList2.clear();
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
private static boolean isOnTop(ArrayList<View> arrayList, ArrayList<View> arrayList2) {
|
||||
if (arrayList.isEmpty() || arrayList2.isEmpty() || arrayList.get(0) != arrayList2.get(0)) {
|
||||
return true;
|
||||
}
|
||||
int min = Math.min(arrayList.size(), arrayList2.size());
|
||||
for (int i = 1; i < min; i++) {
|
||||
View view = arrayList.get(i);
|
||||
View view2 = arrayList2.get(i);
|
||||
if (view != view2) {
|
||||
return isOnTop(view, view2);
|
||||
}
|
||||
}
|
||||
return arrayList2.size() == min;
|
||||
}
|
||||
|
||||
private static void getParents(View view, ArrayList<View> arrayList) {
|
||||
Object parent = view.getParent();
|
||||
if (parent instanceof ViewGroup) {
|
||||
getParents((View) parent, arrayList);
|
||||
}
|
||||
arrayList.add(view);
|
||||
}
|
||||
|
||||
private static boolean isOnTop(View view, View view2) {
|
||||
ViewGroup viewGroup = (ViewGroup) view.getParent();
|
||||
int childCount = viewGroup.getChildCount();
|
||||
if (view.getZ() != view2.getZ()) {
|
||||
return view.getZ() > view2.getZ();
|
||||
}
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
View childAt = viewGroup.getChildAt(ViewGroupUtils.getChildDrawingOrder(viewGroup, i));
|
||||
if (childAt == view) {
|
||||
return false;
|
||||
}
|
||||
if (childAt == view2) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user