// Signature format: 3.0
package androidx.dynamicanimation.animation {

  public abstract class DynamicAnimation<T extends androidx.dynamicanimation.animation.DynamicAnimation<T>> {
    method public T! addEndListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationEndListener!);
    method public T! addUpdateListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationUpdateListener!);
    method public void cancel();
    method public float getMinimumVisibleChange();
    method public boolean isRunning();
    method public void removeEndListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationEndListener!);
    method public void removeUpdateListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationUpdateListener!);
    method public T! setMaxValue(float);
    method public T! setMinValue(float);
    method public T! setMinimumVisibleChange(@FloatRange(from=0.0, fromInclusive=false) float);
    method public T! setStartValue(float);
    method public T! setStartVelocity(float);
    method public void start();
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ALPHA;
    field public static final float MIN_VISIBLE_CHANGE_ALPHA = 0.00390625f;
    field public static final float MIN_VISIBLE_CHANGE_PIXELS = 1.0f;
    field public static final float MIN_VISIBLE_CHANGE_ROTATION_DEGREES = 0.1f;
    field public static final float MIN_VISIBLE_CHANGE_SCALE = 0.002f;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ROTATION;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ROTATION_X;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ROTATION_Y;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCALE_X;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCALE_Y;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCROLL_X;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCROLL_Y;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! TRANSLATION_X;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! TRANSLATION_Y;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! TRANSLATION_Z;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! X;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! Y;
    field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! Z;
  }

  public static interface DynamicAnimation.OnAnimationEndListener {
    method public void onAnimationEnd(androidx.dynamicanimation.animation.DynamicAnimation!, boolean, float, float);
  }

  public static interface DynamicAnimation.OnAnimationUpdateListener {
    method public void onAnimationUpdate(androidx.dynamicanimation.animation.DynamicAnimation!, float, float);
  }

  public abstract static class DynamicAnimation.ViewProperty extends androidx.dynamicanimation.animation.FloatPropertyCompat<android.view.View> {
  }

  public final class FlingAnimation extends androidx.dynamicanimation.animation.DynamicAnimation<androidx.dynamicanimation.animation.FlingAnimation> {
    ctor public FlingAnimation(androidx.dynamicanimation.animation.FloatValueHolder!);
    ctor public FlingAnimation(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K!>!);
    method public float getFriction();
    method public androidx.dynamicanimation.animation.FlingAnimation! setFriction(@FloatRange(from=0.0, fromInclusive=false) float);
    method public androidx.dynamicanimation.animation.FlingAnimation! setMaxValue(float);
    method public androidx.dynamicanimation.animation.FlingAnimation! setMinValue(float);
    method public androidx.dynamicanimation.animation.FlingAnimation! setStartVelocity(float);
  }

  public abstract class FloatPropertyCompat<T> {
    ctor public FloatPropertyCompat(String!);
    method @RequiresApi(24) public static <T> androidx.dynamicanimation.animation.FloatPropertyCompat<T!>! createFloatPropertyCompat(android.util.FloatProperty<T!>!);
    method public abstract float getValue(T!);
    method public abstract void setValue(T!, float);
  }

  public final class FloatValueHolder {
    ctor public FloatValueHolder();
    ctor public FloatValueHolder(float);
    method public float getValue();
    method public void setValue(float);
  }

  public final class SpringAnimation extends androidx.dynamicanimation.animation.DynamicAnimation<androidx.dynamicanimation.animation.SpringAnimation> {
    ctor public SpringAnimation(androidx.dynamicanimation.animation.FloatValueHolder!);
    ctor public SpringAnimation(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K!>!);
    ctor public SpringAnimation(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K!>!, float);
    method public void animateToFinalPosition(float);
    method public boolean canSkipToEnd();
    method public androidx.dynamicanimation.animation.SpringForce! getSpring();
    method public androidx.dynamicanimation.animation.SpringAnimation! setSpring(androidx.dynamicanimation.animation.SpringForce!);
    method public void skipToEnd();
  }

  public final class SpringForce {
    ctor public SpringForce();
    ctor public SpringForce(float);
    method public float getDampingRatio();
    method public float getFinalPosition();
    method public float getStiffness();
    method public androidx.dynamicanimation.animation.SpringForce! setDampingRatio(@FloatRange(from=0.0) float);
    method public androidx.dynamicanimation.animation.SpringForce! setFinalPosition(float);
    method public androidx.dynamicanimation.animation.SpringForce! setStiffness(@FloatRange(from=0.0, fromInclusive=false) float);
    field public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2f;
    field public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75f;
    field public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5f;
    field public static final float DAMPING_RATIO_NO_BOUNCY = 1.0f;
    field public static final float STIFFNESS_HIGH = 10000.0f;
    field public static final float STIFFNESS_LOW = 200.0f;
    field public static final float STIFFNESS_MEDIUM = 1500.0f;
    field public static final float STIFFNESS_VERY_LOW = 50.0f;
  }

}

