304 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
    }
 | 
						|
}
 |