From 995d4b4c36575dd7d78ff16398265a18b2bca2d3 Mon Sep 17 00:00:00 2001 From: Andrew Datsenko Date: Tue, 30 Jul 2024 05:40:59 -0700 Subject: [PATCH] xplat/js/react-native-github/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.java (#45739) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/45739 Changelog: [Internal] Reviewed By: tdn120 Differential Revision: D60233508 fbshipit-source-id: fcf666cb5d2a935c85b0b4507739d002b58f8141 --- .../SimpleSpringInterpolator.java | 50 ------------------- .../SimpleSpringInterpolator.kt | 48 ++++++++++++++++++ 2 files changed, 48 insertions(+), 50 deletions(-) delete mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.java create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.kt diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.java deleted file mode 100644 index 84cbe2ae9ca..00000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.react.uimanager.layoutanimation; - -import android.view.animation.Interpolator; -import com.facebook.infer.annotation.Nullsafe; -import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.bridge.ReadableType; - -/** Simple spring interpolator */ -// TODO(7613736): Improve spring interpolator with friction and damping variable support -/* package */ @Nullsafe(Nullsafe.Mode.LOCAL) -class SimpleSpringInterpolator implements Interpolator { - - private static final float FACTOR = 0.5f; - public static final String PARAM_SPRING_DAMPING = "springDamping"; - private final float mSpringDamping; - - public static float getSpringDamping(ReadableMap params) { - if (params.getType(PARAM_SPRING_DAMPING).equals(ReadableType.Number)) { - return (float) params.getDouble(PARAM_SPRING_DAMPING); - } else { - return FACTOR; - } - } - - public SimpleSpringInterpolator() { - mSpringDamping = FACTOR; - } - - public SimpleSpringInterpolator(float springDamping) { - mSpringDamping = springDamping; - } - - @Override - public float getInterpolation(float input) { - // Using mSpringDamping in this equation is not really the exact mathematical springDamping, but - // a good approximation - // We need to replace this equation with the right Factor that accounts for damping and friction - return (float) - (1 - + Math.pow(2, -10 * input) - * Math.sin((input - mSpringDamping / 4) * Math.PI * 2 / mSpringDamping)); - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.kt new file mode 100644 index 00000000000..1be3ade96c7 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.uimanager.layoutanimation + +import android.view.animation.Interpolator +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.bridge.ReadableType +import com.facebook.react.bridge.ReadableType.Number + +/** Simple spring interpolator */ +// TODO(7613736): Improve spring interpolator with friction and damping variable support +/* package */ +internal class SimpleSpringInterpolator : Interpolator { + private val _springDamping: Float + + @JvmOverloads + public constructor(springDamping: Float = FACTOR) { + _springDamping = springDamping + } + + override public fun getInterpolation(input: Float): Float = + // Using mSpringDamping in this equation is not really the exact mathematical springDamping, + // but a good approximation + // We need to replace this equation with the right Factor that accounts for damping and + // friction + (1 + + Math.pow(2.0, (-10 * input).toDouble()) * + Math.sin((input - _springDamping / 4) * Math.PI * 2 / _springDamping)) + .toFloat() + + public companion object { + private const val FACTOR = 0.5f + public const val PARAM_SPRING_DAMPING: String = "springDamping" + + @JvmStatic + public fun getSpringDamping(params: ReadableMap): Float = + if (params.getType(PARAM_SPRING_DAMPING) == ReadableType.Number) { + params.getDouble(PARAM_SPRING_DAMPING).toFloat() + } else { + FACTOR + } + } +}