2025-03-31 16:33:42 +02:00

304 lines
11 KiB
Java

package androidx.constraintlayout.helper.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import androidx.constraintlayout.core.widgets.ConstraintWidget;
import androidx.constraintlayout.widget.ConstraintHelper;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.R;
/* loaded from: classes.dex */
public class Layer extends ConstraintHelper {
private static final String TAG = "Layer";
private boolean mApplyElevationOnAttach;
private boolean mApplyVisibilityOnAttach;
protected float mComputedCenterX;
protected float mComputedCenterY;
protected float mComputedMaxX;
protected float mComputedMaxY;
protected float mComputedMinX;
protected float mComputedMinY;
ConstraintLayout mContainer;
private float mGroupRotateAngle;
boolean mNeedBounds;
private float mRotationCenterX;
private float mRotationCenterY;
private float mScaleX;
private float mScaleY;
private float mShiftX;
private float mShiftY;
View[] mViews;
public Layer(Context context) {
super(context);
this.mRotationCenterX = Float.NaN;
this.mRotationCenterY = Float.NaN;
this.mGroupRotateAngle = Float.NaN;
this.mScaleX = 1.0f;
this.mScaleY = 1.0f;
this.mComputedCenterX = Float.NaN;
this.mComputedCenterY = Float.NaN;
this.mComputedMaxX = Float.NaN;
this.mComputedMaxY = Float.NaN;
this.mComputedMinX = Float.NaN;
this.mComputedMinY = Float.NaN;
this.mNeedBounds = true;
this.mViews = null;
this.mShiftX = 0.0f;
this.mShiftY = 0.0f;
}
public Layer(Context context, AttributeSet attrs) {
super(context, attrs);
this.mRotationCenterX = Float.NaN;
this.mRotationCenterY = Float.NaN;
this.mGroupRotateAngle = Float.NaN;
this.mScaleX = 1.0f;
this.mScaleY = 1.0f;
this.mComputedCenterX = Float.NaN;
this.mComputedCenterY = Float.NaN;
this.mComputedMaxX = Float.NaN;
this.mComputedMaxY = Float.NaN;
this.mComputedMinX = Float.NaN;
this.mComputedMinY = Float.NaN;
this.mNeedBounds = true;
this.mViews = null;
this.mShiftX = 0.0f;
this.mShiftY = 0.0f;
}
public Layer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mRotationCenterX = Float.NaN;
this.mRotationCenterY = Float.NaN;
this.mGroupRotateAngle = Float.NaN;
this.mScaleX = 1.0f;
this.mScaleY = 1.0f;
this.mComputedCenterX = Float.NaN;
this.mComputedCenterY = Float.NaN;
this.mComputedMaxX = Float.NaN;
this.mComputedMaxY = Float.NaN;
this.mComputedMinX = Float.NaN;
this.mComputedMinY = Float.NaN;
this.mNeedBounds = true;
this.mViews = null;
this.mShiftX = 0.0f;
this.mShiftY = 0.0f;
}
@Override // androidx.constraintlayout.widget.ConstraintHelper
protected void init(AttributeSet attrs) {
super.init(attrs);
this.mUseViewMeasure = false;
if (attrs != null) {
TypedArray obtainStyledAttributes = getContext().obtainStyledAttributes(attrs, R.styleable.ConstraintLayout_Layout);
int indexCount = obtainStyledAttributes.getIndexCount();
for (int i = 0; i < indexCount; i++) {
int index = obtainStyledAttributes.getIndex(i);
if (index == R.styleable.ConstraintLayout_Layout_android_visibility) {
this.mApplyVisibilityOnAttach = true;
} else if (index == R.styleable.ConstraintLayout_Layout_android_elevation) {
this.mApplyElevationOnAttach = true;
}
}
obtainStyledAttributes.recycle();
}
}
@Override // androidx.constraintlayout.widget.ConstraintHelper, android.view.View
protected void onAttachedToWindow() {
super.onAttachedToWindow();
this.mContainer = (ConstraintLayout) getParent();
if (this.mApplyVisibilityOnAttach || this.mApplyElevationOnAttach) {
int visibility = getVisibility();
float elevation = getElevation();
for (int i = 0; i < this.mCount; i++) {
View viewById = this.mContainer.getViewById(this.mIds[i]);
if (viewById != null) {
if (this.mApplyVisibilityOnAttach) {
viewById.setVisibility(visibility);
}
if (this.mApplyElevationOnAttach && elevation > 0.0f) {
viewById.setTranslationZ(viewById.getTranslationZ() + elevation);
}
}
}
}
}
@Override // androidx.constraintlayout.widget.ConstraintHelper
public void updatePreDraw(ConstraintLayout container) {
this.mContainer = container;
float rotation = getRotation();
if (rotation != 0.0f) {
this.mGroupRotateAngle = rotation;
} else {
if (Float.isNaN(this.mGroupRotateAngle)) {
return;
}
this.mGroupRotateAngle = rotation;
}
}
@Override // android.view.View
public void setRotation(float angle) {
this.mGroupRotateAngle = angle;
transform();
}
@Override // android.view.View
public void setScaleX(float scaleX) {
this.mScaleX = scaleX;
transform();
}
@Override // android.view.View
public void setScaleY(float scaleY) {
this.mScaleY = scaleY;
transform();
}
@Override // android.view.View
public void setPivotX(float pivotX) {
this.mRotationCenterX = pivotX;
transform();
}
@Override // android.view.View
public void setPivotY(float pivotY) {
this.mRotationCenterY = pivotY;
transform();
}
@Override // android.view.View
public void setTranslationX(float dx) {
this.mShiftX = dx;
transform();
}
@Override // android.view.View
public void setTranslationY(float dy) {
this.mShiftY = dy;
transform();
}
@Override // android.view.View
public void setVisibility(int visibility) {
super.setVisibility(visibility);
applyLayoutFeatures();
}
@Override // android.view.View
public void setElevation(float elevation) {
super.setElevation(elevation);
applyLayoutFeatures();
}
@Override // androidx.constraintlayout.widget.ConstraintHelper
public void updatePostLayout(ConstraintLayout container) {
reCacheViews();
this.mComputedCenterX = Float.NaN;
this.mComputedCenterY = Float.NaN;
ConstraintWidget constraintWidget = ((ConstraintLayout.LayoutParams) getLayoutParams()).getConstraintWidget();
constraintWidget.setWidth(0);
constraintWidget.setHeight(0);
calcCenters();
layout(((int) this.mComputedMinX) - getPaddingLeft(), ((int) this.mComputedMinY) - getPaddingTop(), ((int) this.mComputedMaxX) + getPaddingRight(), ((int) this.mComputedMaxY) + getPaddingBottom());
transform();
}
private void reCacheViews() {
if (this.mContainer == null || this.mCount == 0) {
return;
}
View[] viewArr = this.mViews;
if (viewArr == null || viewArr.length != this.mCount) {
this.mViews = new View[this.mCount];
}
for (int i = 0; i < this.mCount; i++) {
this.mViews[i] = this.mContainer.getViewById(this.mIds[i]);
}
}
protected void calcCenters() {
if (this.mContainer == null) {
return;
}
if (this.mNeedBounds || Float.isNaN(this.mComputedCenterX) || Float.isNaN(this.mComputedCenterY)) {
if (!Float.isNaN(this.mRotationCenterX) && !Float.isNaN(this.mRotationCenterY)) {
this.mComputedCenterY = this.mRotationCenterY;
this.mComputedCenterX = this.mRotationCenterX;
return;
}
View[] views = getViews(this.mContainer);
int left = views[0].getLeft();
int top = views[0].getTop();
int right = views[0].getRight();
int bottom = views[0].getBottom();
for (int i = 0; i < this.mCount; i++) {
View view = views[i];
left = Math.min(left, view.getLeft());
top = Math.min(top, view.getTop());
right = Math.max(right, view.getRight());
bottom = Math.max(bottom, view.getBottom());
}
this.mComputedMaxX = right;
this.mComputedMaxY = bottom;
this.mComputedMinX = left;
this.mComputedMinY = top;
if (Float.isNaN(this.mRotationCenterX)) {
this.mComputedCenterX = (left + right) / 2;
} else {
this.mComputedCenterX = this.mRotationCenterX;
}
if (Float.isNaN(this.mRotationCenterY)) {
this.mComputedCenterY = (top + bottom) / 2;
} else {
this.mComputedCenterY = this.mRotationCenterY;
}
}
}
private void transform() {
if (this.mContainer == null) {
return;
}
if (this.mViews == null) {
reCacheViews();
}
calcCenters();
double radians = Float.isNaN(this.mGroupRotateAngle) ? 0.0d : Math.toRadians(this.mGroupRotateAngle);
float sin = (float) Math.sin(radians);
float cos = (float) Math.cos(radians);
float f = this.mScaleX;
float f2 = f * cos;
float f3 = this.mScaleY;
float f4 = (-f3) * sin;
float f5 = f * sin;
float f6 = f3 * cos;
for (int i = 0; i < this.mCount; i++) {
View view = this.mViews[i];
int left = (view.getLeft() + view.getRight()) / 2;
int top = (view.getTop() + view.getBottom()) / 2;
float f7 = left - this.mComputedCenterX;
float f8 = top - this.mComputedCenterY;
float f9 = (((f2 * f7) + (f4 * f8)) - f7) + this.mShiftX;
float f10 = (((f7 * f5) + (f6 * f8)) - f8) + this.mShiftY;
view.setTranslationX(f9);
view.setTranslationY(f10);
view.setScaleY(this.mScaleY);
view.setScaleX(this.mScaleX);
if (!Float.isNaN(this.mGroupRotateAngle)) {
view.setRotation(this.mGroupRotateAngle);
}
}
}
@Override // androidx.constraintlayout.widget.ConstraintHelper
protected void applyLayoutFeaturesInConstraintSet(ConstraintLayout container) {
applyLayoutFeatures(container);
}
}