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);
 | |
|     }
 | |
| }
 |