diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java index 53dfa02ae08d..5d658e3231a7 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java +++ b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java @@ -3,6 +3,7 @@ import static java.lang.Float.NaN; import android.graphics.drawable.Drawable; +import android.os.SystemClock; import android.view.View; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.GuardedRunnable; @@ -50,6 +51,10 @@ public class NodesManager implements EventDispatcherListener { + private Long mFirstUptime = SystemClock.uptimeMillis(); + private boolean mSlowAnimationsEnabled = false; + private int mAnimationsDragFactor; + public void scrollTo(int viewTag, double x, double y, boolean animated) { View view; try { @@ -268,6 +273,10 @@ private void onAnimationFrame(long frameTimeNanos) { // Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "onAnimationFrame"); double currentFrameTimeMs = frameTimeNanos / 1000000.; + if (mSlowAnimationsEnabled) { + currentFrameTimeMs = + mFirstUptime + (currentFrameTimeMs - mFirstUptime) / mAnimationsDragFactor; + } if (currentFrameTimeMs > lastFrameTimeMs) { // It is possible for ChoreographerCallback to be executed twice within the same frame @@ -523,4 +532,12 @@ private static void addProp(WritableMap propMap, String key, Object value) { throw new IllegalStateException("[Reanimated] Unknown type of animated value."); } } + + public void enableSlowAnimations(boolean slowAnimationsEnabled, int animationsDragFactor) { + mSlowAnimationsEnabled = slowAnimationsEnabled; + mAnimationsDragFactor = animationsDragFactor; + if (slowAnimationsEnabled) { + mFirstUptime = SystemClock.uptimeMillis(); + } + } } diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java index 05231d5db19b..2e874ae0b731 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java +++ b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java @@ -45,6 +45,7 @@ public abstract class NativeProxyCommon { private KeyboardAnimationManager keyboardAnimationManager; private Long firstUptime = SystemClock.uptimeMillis(); private boolean slowAnimationsEnabled = false; + private final int ANIMATIONS_DRAG_FACTOR = 10; protected String cppVersion = null; protected NativeProxyCommon(ReactApplicationContext context) { @@ -78,6 +79,7 @@ private void toggleSlowAnimations() { if (slowAnimationsEnabled) { firstUptime = SystemClock.uptimeMillis(); } + mNodesManager.enableSlowAnimations(slowAnimationsEnabled, ANIMATIONS_DRAG_FACTOR); } private void addDevMenuOption() { @@ -156,7 +158,6 @@ public void setGestureState(int handlerTag, int newState) { @DoNotStrip public long getAnimationTimestamp() { if (slowAnimationsEnabled) { - final long ANIMATIONS_DRAG_FACTOR = 10; return this.firstUptime + (SystemClock.uptimeMillis() - this.firstUptime) / ANIMATIONS_DRAG_FACTOR; } else { diff --git a/packages/react-native-reanimated/cspell.json b/packages/react-native-reanimated/cspell.json index 6fe4bc1f7077..c28715258965 100644 --- a/packages/react-native-reanimated/cspell.json +++ b/packages/react-native-reanimated/cspell.json @@ -15,6 +15,7 @@ "collapsable", "devs", "easings", + "gesturehandler", "inout", "ispreview", "layoutable",