372 lines
15 KiB
Java
372 lines
15 KiB
Java
package androidx.constraintlayout.motion.widget;
|
|
|
|
import android.content.Context;
|
|
import android.content.res.TypedArray;
|
|
import android.graphics.RectF;
|
|
import android.util.AttributeSet;
|
|
import android.util.Log;
|
|
import android.util.SparseIntArray;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import androidx.constraintlayout.core.motion.utils.Easing;
|
|
import androidx.constraintlayout.core.motion.utils.TypedValues;
|
|
import androidx.constraintlayout.motion.utils.ViewSpline;
|
|
import androidx.constraintlayout.widget.R;
|
|
import java.util.HashMap;
|
|
|
|
/* loaded from: classes.dex */
|
|
public class KeyPosition extends KeyPositionBase {
|
|
public static final String DRAWPATH = "drawPath";
|
|
static final int KEY_TYPE = 2;
|
|
static final String NAME = "KeyPosition";
|
|
public static final String PERCENT_HEIGHT = "percentHeight";
|
|
public static final String PERCENT_WIDTH = "percentWidth";
|
|
public static final String PERCENT_X = "percentX";
|
|
public static final String PERCENT_Y = "percentY";
|
|
public static final String SIZE_PERCENT = "sizePercent";
|
|
private static final String TAG = "KeyPosition";
|
|
public static final String TRANSITION_EASING = "transitionEasing";
|
|
public static final int TYPE_CARTESIAN = 0;
|
|
public static final int TYPE_PATH = 1;
|
|
public static final int TYPE_SCREEN = 2;
|
|
String mTransitionEasing = null;
|
|
int mPathMotionArc = UNSET;
|
|
int mDrawPath = 0;
|
|
float mPercentWidth = Float.NaN;
|
|
float mPercentHeight = Float.NaN;
|
|
float mPercentX = Float.NaN;
|
|
float mPercentY = Float.NaN;
|
|
float mAltPercentX = Float.NaN;
|
|
float mAltPercentY = Float.NaN;
|
|
int mPositionType = 0;
|
|
private float mCalculatedPositionX = Float.NaN;
|
|
private float mCalculatedPositionY = Float.NaN;
|
|
|
|
private void calcPathPosition(float start_x, float start_y, float end_x, float end_y) {
|
|
float f = end_x - start_x;
|
|
float f2 = end_y - start_y;
|
|
float f3 = this.mPercentX;
|
|
float f4 = this.mPercentY;
|
|
this.mCalculatedPositionX = start_x + (f * f3) + ((-f2) * f4);
|
|
this.mCalculatedPositionY = start_y + (f2 * f3) + (f * f4);
|
|
}
|
|
|
|
private void calcScreenPosition(int layoutWidth, int layoutHeight) {
|
|
float f = this.mPercentX;
|
|
float f2 = 0;
|
|
this.mCalculatedPositionX = (layoutWidth * f) + f2;
|
|
this.mCalculatedPositionY = (layoutHeight * f) + f2;
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
public void addValues(HashMap<String, ViewSpline> splines) {
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.KeyPositionBase
|
|
float getPositionX() {
|
|
return this.mCalculatedPositionX;
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.KeyPositionBase
|
|
float getPositionY() {
|
|
return this.mCalculatedPositionY;
|
|
}
|
|
|
|
public void setType(int type) {
|
|
this.mPositionType = type;
|
|
}
|
|
|
|
public KeyPosition() {
|
|
this.mType = 2;
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
public void load(Context context, AttributeSet attrs) {
|
|
Loader.read(this, context.obtainStyledAttributes(attrs, R.styleable.KeyPosition));
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.KeyPositionBase
|
|
void calcPosition(int layoutWidth, int layoutHeight, float start_x, float start_y, float end_x, float end_y) {
|
|
int i = this.mPositionType;
|
|
if (i == 1) {
|
|
calcPathPosition(start_x, start_y, end_x, end_y);
|
|
} else if (i == 2) {
|
|
calcScreenPosition(layoutWidth, layoutHeight);
|
|
} else {
|
|
calcCartesianPosition(start_x, start_y, end_x, end_y);
|
|
}
|
|
}
|
|
|
|
private void calcCartesianPosition(float start_x, float start_y, float end_x, float end_y) {
|
|
float f = end_x - start_x;
|
|
float f2 = end_y - start_y;
|
|
float f3 = Float.isNaN(this.mPercentX) ? 0.0f : this.mPercentX;
|
|
float f4 = Float.isNaN(this.mAltPercentY) ? 0.0f : this.mAltPercentY;
|
|
float f5 = Float.isNaN(this.mPercentY) ? 0.0f : this.mPercentY;
|
|
this.mCalculatedPositionX = (int) (start_x + (f3 * f) + ((Float.isNaN(this.mAltPercentX) ? 0.0f : this.mAltPercentX) * f2));
|
|
this.mCalculatedPositionY = (int) (start_y + (f * f4) + (f2 * f5));
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.KeyPositionBase
|
|
public void positionAttributes(View view, RectF start, RectF end, float x, float y, String[] attribute, float[] value) {
|
|
int i = this.mPositionType;
|
|
if (i == 1) {
|
|
positionPathAttributes(start, end, x, y, attribute, value);
|
|
} else if (i == 2) {
|
|
positionScreenAttributes(view, start, end, x, y, attribute, value);
|
|
} else {
|
|
positionCartAttributes(start, end, x, y, attribute, value);
|
|
}
|
|
}
|
|
|
|
void positionPathAttributes(RectF start, RectF end, float x, float y, String[] attribute, float[] value) {
|
|
float centerX = start.centerX();
|
|
float centerY = start.centerY();
|
|
float centerX2 = end.centerX() - centerX;
|
|
float centerY2 = end.centerY() - centerY;
|
|
float hypot = (float) Math.hypot(centerX2, centerY2);
|
|
if (hypot < 1.0E-4d) {
|
|
System.out.println("distance ~ 0");
|
|
value[0] = 0.0f;
|
|
value[1] = 0.0f;
|
|
return;
|
|
}
|
|
float f = centerX2 / hypot;
|
|
float f2 = centerY2 / hypot;
|
|
float f3 = y - centerY;
|
|
float f4 = x - centerX;
|
|
float f5 = ((f * f3) - (f4 * f2)) / hypot;
|
|
float f6 = ((f * f4) + (f2 * f3)) / hypot;
|
|
String str = attribute[0];
|
|
if (str != null) {
|
|
if ("percentX".equals(str)) {
|
|
value[0] = f6;
|
|
value[1] = f5;
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
attribute[0] = "percentX";
|
|
attribute[1] = "percentY";
|
|
value[0] = f6;
|
|
value[1] = f5;
|
|
}
|
|
|
|
void positionScreenAttributes(View view, RectF start, RectF end, float x, float y, String[] attribute, float[] value) {
|
|
start.centerX();
|
|
start.centerY();
|
|
end.centerX();
|
|
end.centerY();
|
|
ViewGroup viewGroup = (ViewGroup) view.getParent();
|
|
int width = viewGroup.getWidth();
|
|
int height = viewGroup.getHeight();
|
|
String str = attribute[0];
|
|
if (str != null) {
|
|
if ("percentX".equals(str)) {
|
|
value[0] = x / width;
|
|
value[1] = y / height;
|
|
return;
|
|
} else {
|
|
value[1] = x / width;
|
|
value[0] = y / height;
|
|
return;
|
|
}
|
|
}
|
|
attribute[0] = "percentX";
|
|
value[0] = x / width;
|
|
attribute[1] = "percentY";
|
|
value[1] = y / height;
|
|
}
|
|
|
|
void positionCartAttributes(RectF start, RectF end, float x, float y, String[] attribute, float[] value) {
|
|
float centerX = start.centerX();
|
|
float centerY = start.centerY();
|
|
float centerX2 = end.centerX() - centerX;
|
|
float centerY2 = end.centerY() - centerY;
|
|
String str = attribute[0];
|
|
if (str != null) {
|
|
if ("percentX".equals(str)) {
|
|
value[0] = (x - centerX) / centerX2;
|
|
value[1] = (y - centerY) / centerY2;
|
|
return;
|
|
} else {
|
|
value[1] = (x - centerX) / centerX2;
|
|
value[0] = (y - centerY) / centerY2;
|
|
return;
|
|
}
|
|
}
|
|
attribute[0] = "percentX";
|
|
value[0] = (x - centerX) / centerX2;
|
|
attribute[1] = "percentY";
|
|
value[1] = (y - centerY) / centerY2;
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.KeyPositionBase
|
|
public boolean intersects(int layoutWidth, int layoutHeight, RectF start, RectF end, float x, float y) {
|
|
calcPosition(layoutWidth, layoutHeight, start.centerX(), start.centerY(), end.centerX(), end.centerY());
|
|
return Math.abs(x - this.mCalculatedPositionX) < 20.0f && Math.abs(y - this.mCalculatedPositionY) < 20.0f;
|
|
}
|
|
|
|
private static class Loader {
|
|
private static final int CURVE_FIT = 4;
|
|
private static final int DRAW_PATH = 5;
|
|
private static final int FRAME_POSITION = 2;
|
|
private static final int PATH_MOTION_ARC = 10;
|
|
private static final int PERCENT_HEIGHT = 12;
|
|
private static final int PERCENT_WIDTH = 11;
|
|
private static final int PERCENT_X = 6;
|
|
private static final int PERCENT_Y = 7;
|
|
private static final int SIZE_PERCENT = 8;
|
|
private static final int TARGET_ID = 1;
|
|
private static final int TRANSITION_EASING = 3;
|
|
private static final int TYPE = 9;
|
|
private static SparseIntArray mAttrMap;
|
|
|
|
private Loader() {
|
|
}
|
|
|
|
static {
|
|
SparseIntArray sparseIntArray = new SparseIntArray();
|
|
mAttrMap = sparseIntArray;
|
|
sparseIntArray.append(R.styleable.KeyPosition_motionTarget, 1);
|
|
mAttrMap.append(R.styleable.KeyPosition_framePosition, 2);
|
|
mAttrMap.append(R.styleable.KeyPosition_transitionEasing, 3);
|
|
mAttrMap.append(R.styleable.KeyPosition_curveFit, 4);
|
|
mAttrMap.append(R.styleable.KeyPosition_drawPath, 5);
|
|
mAttrMap.append(R.styleable.KeyPosition_percentX, 6);
|
|
mAttrMap.append(R.styleable.KeyPosition_percentY, 7);
|
|
mAttrMap.append(R.styleable.KeyPosition_keyPositionType, 9);
|
|
mAttrMap.append(R.styleable.KeyPosition_sizePercent, 8);
|
|
mAttrMap.append(R.styleable.KeyPosition_percentWidth, 11);
|
|
mAttrMap.append(R.styleable.KeyPosition_percentHeight, 12);
|
|
mAttrMap.append(R.styleable.KeyPosition_pathMotionArc, 10);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static void read(KeyPosition c, TypedArray a) {
|
|
int indexCount = a.getIndexCount();
|
|
for (int i = 0; i < indexCount; i++) {
|
|
int index = a.getIndex(i);
|
|
switch (mAttrMap.get(index)) {
|
|
case 1:
|
|
if (MotionLayout.IS_IN_EDIT_MODE) {
|
|
c.mTargetId = a.getResourceId(index, c.mTargetId);
|
|
if (c.mTargetId == -1) {
|
|
c.mTargetString = a.getString(index);
|
|
break;
|
|
} else {
|
|
break;
|
|
}
|
|
} else if (a.peekValue(index).type == 3) {
|
|
c.mTargetString = a.getString(index);
|
|
break;
|
|
} else {
|
|
c.mTargetId = a.getResourceId(index, c.mTargetId);
|
|
break;
|
|
}
|
|
case 2:
|
|
c.mFramePosition = a.getInt(index, c.mFramePosition);
|
|
break;
|
|
case 3:
|
|
if (a.peekValue(index).type == 3) {
|
|
c.mTransitionEasing = a.getString(index);
|
|
break;
|
|
} else {
|
|
c.mTransitionEasing = Easing.NAMED_EASING[a.getInteger(index, 0)];
|
|
break;
|
|
}
|
|
case 4:
|
|
c.mCurveFit = a.getInteger(index, c.mCurveFit);
|
|
break;
|
|
case 5:
|
|
c.mDrawPath = a.getInt(index, c.mDrawPath);
|
|
break;
|
|
case 6:
|
|
c.mPercentX = a.getFloat(index, c.mPercentX);
|
|
break;
|
|
case 7:
|
|
c.mPercentY = a.getFloat(index, c.mPercentY);
|
|
break;
|
|
case 8:
|
|
float f = a.getFloat(index, c.mPercentHeight);
|
|
c.mPercentWidth = f;
|
|
c.mPercentHeight = f;
|
|
break;
|
|
case 9:
|
|
c.mPositionType = a.getInt(index, c.mPositionType);
|
|
break;
|
|
case 10:
|
|
c.mPathMotionArc = a.getInt(index, c.mPathMotionArc);
|
|
break;
|
|
case 11:
|
|
c.mPercentWidth = a.getFloat(index, c.mPercentWidth);
|
|
break;
|
|
case 12:
|
|
c.mPercentHeight = a.getFloat(index, c.mPercentHeight);
|
|
break;
|
|
default:
|
|
Log.e(TypedValues.PositionType.NAME, "unused attribute 0x" + Integer.toHexString(index) + " " + mAttrMap.get(index));
|
|
break;
|
|
}
|
|
}
|
|
if (c.mFramePosition == -1) {
|
|
Log.e(TypedValues.PositionType.NAME, "no frame position");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
public void setValue(String tag, Object value) {
|
|
tag.hashCode();
|
|
switch (tag) {
|
|
case "transitionEasing":
|
|
this.mTransitionEasing = value.toString();
|
|
break;
|
|
case "percentWidth":
|
|
this.mPercentWidth = toFloat(value);
|
|
break;
|
|
case "percentHeight":
|
|
this.mPercentHeight = toFloat(value);
|
|
break;
|
|
case "drawPath":
|
|
this.mDrawPath = toInt(value);
|
|
break;
|
|
case "sizePercent":
|
|
float f = toFloat(value);
|
|
this.mPercentWidth = f;
|
|
this.mPercentHeight = f;
|
|
break;
|
|
case "percentX":
|
|
this.mPercentX = toFloat(value);
|
|
break;
|
|
case "percentY":
|
|
this.mPercentY = toFloat(value);
|
|
break;
|
|
}
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
public Key copy(Key src) {
|
|
super.copy(src);
|
|
KeyPosition keyPosition = (KeyPosition) src;
|
|
this.mTransitionEasing = keyPosition.mTransitionEasing;
|
|
this.mPathMotionArc = keyPosition.mPathMotionArc;
|
|
this.mDrawPath = keyPosition.mDrawPath;
|
|
this.mPercentWidth = keyPosition.mPercentWidth;
|
|
this.mPercentHeight = Float.NaN;
|
|
this.mPercentX = keyPosition.mPercentX;
|
|
this.mPercentY = keyPosition.mPercentY;
|
|
this.mAltPercentX = keyPosition.mAltPercentX;
|
|
this.mAltPercentY = keyPosition.mAltPercentY;
|
|
this.mCalculatedPositionX = keyPosition.mCalculatedPositionX;
|
|
this.mCalculatedPositionY = keyPosition.mCalculatedPositionY;
|
|
return this;
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
/* renamed from: clone */
|
|
public Key mo49clone() {
|
|
return new KeyPosition().copy(this);
|
|
}
|
|
}
|