431 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			431 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.dynamicanimation.animation;
 | |
| 
 | |
| import android.os.Looper;
 | |
| import android.util.AndroidRuntimeException;
 | |
| import android.view.View;
 | |
| import androidx.constraintlayout.motion.widget.Key;
 | |
| import androidx.core.view.ViewCompat;
 | |
| import androidx.dynamicanimation.animation.AnimationHandler;
 | |
| import androidx.dynamicanimation.animation.DynamicAnimation;
 | |
| import java.util.ArrayList;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| public abstract class DynamicAnimation<T extends DynamicAnimation<T>> implements AnimationHandler.AnimationFrameCallback {
 | |
|     public static final float MIN_VISIBLE_CHANGE_ALPHA = 0.00390625f;
 | |
|     public static final float MIN_VISIBLE_CHANGE_PIXELS = 1.0f;
 | |
|     public static final float MIN_VISIBLE_CHANGE_ROTATION_DEGREES = 0.1f;
 | |
|     public static final float MIN_VISIBLE_CHANGE_SCALE = 0.002f;
 | |
|     private static final float THRESHOLD_MULTIPLIER = 0.75f;
 | |
|     private static final float UNSET = Float.MAX_VALUE;
 | |
|     private final ArrayList<OnAnimationEndListener> mEndListeners;
 | |
|     private long mLastFrameTime;
 | |
|     float mMaxValue;
 | |
|     float mMinValue;
 | |
|     private float mMinVisibleChange;
 | |
|     final FloatPropertyCompat mProperty;
 | |
|     boolean mRunning;
 | |
|     boolean mStartValueIsSet;
 | |
|     final Object mTarget;
 | |
|     private final ArrayList<OnAnimationUpdateListener> mUpdateListeners;
 | |
|     float mValue;
 | |
|     float mVelocity;
 | |
|     public static final ViewProperty TRANSLATION_X = new ViewProperty("translationX") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.1
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setTranslationX(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getTranslationX();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty TRANSLATION_Y = new ViewProperty("translationY") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.2
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setTranslationY(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getTranslationY();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty TRANSLATION_Z = new ViewProperty("translationZ") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.3
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             ViewCompat.setTranslationZ(view, f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return ViewCompat.getTranslationZ(view);
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty SCALE_X = new ViewProperty("scaleX") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.4
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setScaleX(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getScaleX();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty SCALE_Y = new ViewProperty("scaleY") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.5
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setScaleY(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getScaleY();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty ROTATION = new ViewProperty(Key.ROTATION) { // from class: androidx.dynamicanimation.animation.DynamicAnimation.6
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setRotation(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getRotation();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty ROTATION_X = new ViewProperty("rotationX") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.7
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setRotationX(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getRotationX();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty ROTATION_Y = new ViewProperty("rotationY") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.8
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setRotationY(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getRotationY();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty X = new ViewProperty("x") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.9
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setX(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getX();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty Y = new ViewProperty("y") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.10
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setY(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getY();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty Z = new ViewProperty("z") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.11
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             ViewCompat.setZ(view, f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return ViewCompat.getZ(view);
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty ALPHA = new ViewProperty("alpha") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.12
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setAlpha(f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getAlpha();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty SCROLL_X = new ViewProperty("scrollX") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.13
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setScrollX((int) f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getScrollX();
 | |
|         }
 | |
|     };
 | |
|     public static final ViewProperty SCROLL_Y = new ViewProperty("scrollY") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.14
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public void setValue(View view, float f) {
 | |
|             view.setScrollY((int) f);
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|         public float getValue(View view) {
 | |
|             return view.getScrollY();
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     public interface OnAnimationEndListener {
 | |
|         void onAnimationEnd(DynamicAnimation dynamicAnimation, boolean z, float f, float f2);
 | |
|     }
 | |
| 
 | |
|     public interface OnAnimationUpdateListener {
 | |
|         void onAnimationUpdate(DynamicAnimation dynamicAnimation, float f, float f2);
 | |
|     }
 | |
| 
 | |
|     abstract float getAcceleration(float f, float f2);
 | |
| 
 | |
|     public float getMinimumVisibleChange() {
 | |
|         return this.mMinVisibleChange;
 | |
|     }
 | |
| 
 | |
|     float getValueThreshold() {
 | |
|         return this.mMinVisibleChange * 0.75f;
 | |
|     }
 | |
| 
 | |
|     abstract boolean isAtEquilibrium(float f, float f2);
 | |
| 
 | |
|     public boolean isRunning() {
 | |
|         return this.mRunning;
 | |
|     }
 | |
| 
 | |
|     public T setMaxValue(float f) {
 | |
|         this.mMaxValue = f;
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     public T setMinValue(float f) {
 | |
|         this.mMinValue = f;
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     public T setStartValue(float f) {
 | |
|         this.mValue = f;
 | |
|         this.mStartValueIsSet = true;
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     public T setStartVelocity(float f) {
 | |
|         this.mVelocity = f;
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     abstract void setValueThreshold(float f);
 | |
| 
 | |
|     abstract boolean updateValueAndVelocity(long j);
 | |
| 
 | |
|     public static abstract class ViewProperty extends FloatPropertyCompat<View> {
 | |
|         private ViewProperty(String str) {
 | |
|             super(str);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     static class MassState {
 | |
|         float mValue;
 | |
|         float mVelocity;
 | |
| 
 | |
|         MassState() {
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     DynamicAnimation(final FloatValueHolder floatValueHolder) {
 | |
|         this.mVelocity = 0.0f;
 | |
|         this.mValue = Float.MAX_VALUE;
 | |
|         this.mStartValueIsSet = false;
 | |
|         this.mRunning = false;
 | |
|         this.mMaxValue = Float.MAX_VALUE;
 | |
|         this.mMinValue = -Float.MAX_VALUE;
 | |
|         this.mLastFrameTime = 0L;
 | |
|         this.mEndListeners = new ArrayList<>();
 | |
|         this.mUpdateListeners = new ArrayList<>();
 | |
|         this.mTarget = null;
 | |
|         this.mProperty = new FloatPropertyCompat("FloatValueHolder") { // from class: androidx.dynamicanimation.animation.DynamicAnimation.15
 | |
|             @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|             public float getValue(Object obj) {
 | |
|                 return floatValueHolder.getValue();
 | |
|             }
 | |
| 
 | |
|             @Override // androidx.dynamicanimation.animation.FloatPropertyCompat
 | |
|             public void setValue(Object obj, float f) {
 | |
|                 floatValueHolder.setValue(f);
 | |
|             }
 | |
|         };
 | |
|         this.mMinVisibleChange = 1.0f;
 | |
|     }
 | |
| 
 | |
|     <K> DynamicAnimation(K k, FloatPropertyCompat<K> floatPropertyCompat) {
 | |
|         this.mVelocity = 0.0f;
 | |
|         this.mValue = Float.MAX_VALUE;
 | |
|         this.mStartValueIsSet = false;
 | |
|         this.mRunning = false;
 | |
|         this.mMaxValue = Float.MAX_VALUE;
 | |
|         this.mMinValue = -Float.MAX_VALUE;
 | |
|         this.mLastFrameTime = 0L;
 | |
|         this.mEndListeners = new ArrayList<>();
 | |
|         this.mUpdateListeners = new ArrayList<>();
 | |
|         this.mTarget = k;
 | |
|         this.mProperty = floatPropertyCompat;
 | |
|         if (floatPropertyCompat == ROTATION || floatPropertyCompat == ROTATION_X || floatPropertyCompat == ROTATION_Y) {
 | |
|             this.mMinVisibleChange = 0.1f;
 | |
|             return;
 | |
|         }
 | |
|         if (floatPropertyCompat == ALPHA) {
 | |
|             this.mMinVisibleChange = 0.00390625f;
 | |
|         } else if (floatPropertyCompat == SCALE_X || floatPropertyCompat == SCALE_Y) {
 | |
|             this.mMinVisibleChange = 0.00390625f;
 | |
|         } else {
 | |
|             this.mMinVisibleChange = 1.0f;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public T addEndListener(OnAnimationEndListener onAnimationEndListener) {
 | |
|         if (!this.mEndListeners.contains(onAnimationEndListener)) {
 | |
|             this.mEndListeners.add(onAnimationEndListener);
 | |
|         }
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     public void removeEndListener(OnAnimationEndListener onAnimationEndListener) {
 | |
|         removeEntry(this.mEndListeners, onAnimationEndListener);
 | |
|     }
 | |
| 
 | |
|     public T addUpdateListener(OnAnimationUpdateListener onAnimationUpdateListener) {
 | |
|         if (isRunning()) {
 | |
|             throw new UnsupportedOperationException("Error: Update listeners must be added beforethe animation.");
 | |
|         }
 | |
|         if (!this.mUpdateListeners.contains(onAnimationUpdateListener)) {
 | |
|             this.mUpdateListeners.add(onAnimationUpdateListener);
 | |
|         }
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     public void removeUpdateListener(OnAnimationUpdateListener onAnimationUpdateListener) {
 | |
|         removeEntry(this.mUpdateListeners, onAnimationUpdateListener);
 | |
|     }
 | |
| 
 | |
|     public T setMinimumVisibleChange(float f) {
 | |
|         if (f <= 0.0f) {
 | |
|             throw new IllegalArgumentException("Minimum visible change must be positive.");
 | |
|         }
 | |
|         this.mMinVisibleChange = f;
 | |
|         setValueThreshold(f * 0.75f);
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     private static <T> void removeNullEntries(ArrayList<T> arrayList) {
 | |
|         for (int size = arrayList.size() - 1; size >= 0; size--) {
 | |
|             if (arrayList.get(size) == null) {
 | |
|                 arrayList.remove(size);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static <T> void removeEntry(ArrayList<T> arrayList, T t) {
 | |
|         int indexOf = arrayList.indexOf(t);
 | |
|         if (indexOf >= 0) {
 | |
|             arrayList.set(indexOf, null);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void start() {
 | |
|         if (Looper.myLooper() != Looper.getMainLooper()) {
 | |
|             throw new AndroidRuntimeException("Animations may only be started on the main thread");
 | |
|         }
 | |
|         if (this.mRunning) {
 | |
|             return;
 | |
|         }
 | |
|         startAnimationInternal();
 | |
|     }
 | |
| 
 | |
|     public void cancel() {
 | |
|         if (Looper.myLooper() != Looper.getMainLooper()) {
 | |
|             throw new AndroidRuntimeException("Animations may only be canceled on the main thread");
 | |
|         }
 | |
|         if (this.mRunning) {
 | |
|             endAnimationInternal(true);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void startAnimationInternal() {
 | |
|         if (this.mRunning) {
 | |
|             return;
 | |
|         }
 | |
|         this.mRunning = true;
 | |
|         if (!this.mStartValueIsSet) {
 | |
|             this.mValue = getPropertyValue();
 | |
|         }
 | |
|         float f = this.mValue;
 | |
|         if (f > this.mMaxValue || f < this.mMinValue) {
 | |
|             throw new IllegalArgumentException("Starting value need to be in between min value and max value");
 | |
|         }
 | |
|         AnimationHandler.getInstance().addAnimationFrameCallback(this, 0L);
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.dynamicanimation.animation.AnimationHandler.AnimationFrameCallback
 | |
|     public boolean doAnimationFrame(long j) {
 | |
|         long j2 = this.mLastFrameTime;
 | |
|         if (j2 == 0) {
 | |
|             this.mLastFrameTime = j;
 | |
|             setPropertyValue(this.mValue);
 | |
|             return false;
 | |
|         }
 | |
|         this.mLastFrameTime = j;
 | |
|         boolean updateValueAndVelocity = updateValueAndVelocity(j - j2);
 | |
|         float min = Math.min(this.mValue, this.mMaxValue);
 | |
|         this.mValue = min;
 | |
|         float max = Math.max(min, this.mMinValue);
 | |
|         this.mValue = max;
 | |
|         setPropertyValue(max);
 | |
|         if (updateValueAndVelocity) {
 | |
|             endAnimationInternal(false);
 | |
|         }
 | |
|         return updateValueAndVelocity;
 | |
|     }
 | |
| 
 | |
|     private void endAnimationInternal(boolean z) {
 | |
|         this.mRunning = false;
 | |
|         AnimationHandler.getInstance().removeCallback(this);
 | |
|         this.mLastFrameTime = 0L;
 | |
|         this.mStartValueIsSet = false;
 | |
|         for (int i = 0; i < this.mEndListeners.size(); i++) {
 | |
|             if (this.mEndListeners.get(i) != null) {
 | |
|                 this.mEndListeners.get(i).onAnimationEnd(this, z, this.mValue, this.mVelocity);
 | |
|             }
 | |
|         }
 | |
|         removeNullEntries(this.mEndListeners);
 | |
|     }
 | |
| 
 | |
|     void setPropertyValue(float f) {
 | |
|         this.mProperty.setValue(this.mTarget, f);
 | |
|         for (int i = 0; i < this.mUpdateListeners.size(); i++) {
 | |
|             if (this.mUpdateListeners.get(i) != null) {
 | |
|                 this.mUpdateListeners.get(i).onAnimationUpdate(this, this.mValue, this.mVelocity);
 | |
|             }
 | |
|         }
 | |
|         removeNullEntries(this.mUpdateListeners);
 | |
|     }
 | |
| 
 | |
|     private float getPropertyValue() {
 | |
|         return this.mProperty.getValue(this.mTarget);
 | |
|     }
 | |
| }
 |