Layout transitions
Layout transitions allows you to replace layout changes with smooth transitions. Each layout change may include changes of size and position and both of them can be animated.
Predefined Transitions
Below we listed all of the currently available predefined layout transitions with their layout animation modifiers.
Linear transition
Linear transition animates both position and dimension in the same way.
Reference
import { LinearTransition } from 'react-native-reanimated';
function App() {
return <Animated.View layout={LinearTransition} />;
}
Modifiers
Easing Optional
Easing modifiers are time-based modifiers that relay on withTiming
function.
LinearTransition.easing(Easing.ease);
.easing(easingFunction: EasingFunction)
is an easing function which defines the animation curve. Defaults toEasing.inOut(Easing.quad)
The .easing(...)
modifiers have no effect when .springify()
is used.
Spring-based Optional
Spring-based modifiers relay on withSpring
function.
Just as in withSpring
config, spring-based modifiers can be physics-based (have mass
and damping
modifiers) or duration-based (have duration
and dampingRatio
modifiers).
The mass
and damping
(physics-based) properties can't be used at the same time as duration
and dampingRatio
(duration-based).
When used together duration
and dampingRatio
overrides mass
and damping
props.
LinearTransition.springify()
.damping(30)
.mass(5)
.rotate(20)
.stiffness(10)
.overshootClamping(false)
.restDisplacementThreshold(0.1)
.restSpeedThreshold(5);
.springify()
enables the spring-based animation configuration..damping(value: number)
decides how quickly a spring stops moving. Higher damping means the spring will come to rest faster. Defaults to10
..dampingRatio(value: number)
decides how damped the spring is. Value1
means the spring is critically damped, and value>1
means the spring is overdamped. Defaults to0.5
..mass(value: number)
is the weight of the spring. Reducing this value makes the animation faster. Defaults to1
..rotate(degree: string)
lets you rotate the element..stiffness(value: number)
decides how bouncy the spring is - the higher the number, the less bouncy it is. Defaults to100
..overshootClamping(value: boolean)
decides whether a spring can bounce over the designated position. Defaults tofalse
..restDisplacementThreshold(value: number)
is the displacement below which the spring will snap to the designated position without further oscillations. Defaults to0.001
..restSpeedThreshold(value: number)
is the speed in pixels per second below which the spring will snap to the designated position without further oscillations. Defaults to2
.
Common Optional
LinearTransition.delay(500)
.reduceMotion(ReduceMotion.Never)
.withInitialValues({ transform: [{ translateY: 420 }] })
.withCallback((finished) => {
console.log(`finished without interruptions: ${finished}`);
});
.duration(duration: number)
sets length of the animation (in milliseconds). Defaults to '300'..delay(duration: number)
is the delay before the animation starts (in milliseconds). Defaults to0
..reduceMotion(reduceMotion: ReduceMotion)
determines how the animation responds to the device's reduced motion accessibility setting..withInitialValues(values: StyleProps)
allows to override the initial config of the animation..withCallback(callback: (finished: boolean) => void)
is the callback that will fire after the animation ends. Setsfinished
totrue
when animation ends without interruptions, andfalse
otherwise.
Remarks
- The animation will end if both the animation speed is below
restSpeedThreshold
and the distance to its end is less thanrestDisplacementThreshold
. Keep in mind that if you haven't set one of the thresholds, its value will be set to the default.
Example
Sequenced Transition
Sequenced transition animates x-position and width first, then y-position and height.
Reference
import { SequencedTransition } from 'react-native-reanimated';
function App() {
return <Animated.View layout={SequencedTransition} />;
}
Modifiers
SequencedTransition.duration(1000)
.delay(500)
.reverse()
.reduceMotion(ReduceMotion.Never)
.withCallback((finished) => {
console.log(`finished without interruptions: ${finished}`);
});
.duration(duration: number)
sets length of the animation (in milliseconds). Defaults to '500'..delay(duration: number)
is the delay before the animation starts (in milliseconds). Defaults to0
..reverse()
determines if the animation should run in reverse. Defaults tofalse
..reduceMotion(reduceMotion: ReduceMotion)
determines how the animation responds to the device's reduced motion accessibility setting..withCallback(callback: (finished: boolean) => void)
is the callback that will fire after the animation ends. Setsfinished
totrue
when animation ends without interruptions, andfalse
otherwise.
Example
Fading Transition
Fading transition animates the opacity of component. It will disappear while having previous position and dimensions and appear with new ones.
Reference
import { FadingTransition } from 'react-native-reanimated';
function App() {
return <Animated.View layout={FadingTransition} />;
}
Modifiers
FadingTransition.duration(1000)
.delay(500)
.reduceMotion(ReduceMotion.Never)
.withCallback((finished) => {
console.log(`finished without interruptions: ${finished}`);
});
.duration(duration: number)
sets length of the animation (in milliseconds). Defaults to '500'..delay(duration: number)
is the delay before the animation starts (in milliseconds). Defaults to0
..reduceMotion(reduceMotion: ReduceMotion)
determines how the animation responds to the device's reduced motion accessibility setting..withCallback(callback: (finished: boolean) => void)
is the callback that will fire after the animation ends. Setsfinished
totrue
when animation ends without interruptions, andfalse
otherwise.
Example
Jumping Transition
Jumping transition makes components "jump" to the new position.
Reference
import { JumpingTransition } from 'react-native-reanimated';
function App() {
return <Animated.View layout={JumpingTransition} />;
}
Modifiers
JumpingTransition.duration(1000)
.delay(500)
.reduceMotion(ReduceMotion.Never)
.withCallback((finished) => {
console.log(`finished without interruptions: ${finished}`);
});
.duration(duration: number)
sets length of the animation (in milliseconds). Defaults to '300'..delay(duration: number)
is the delay before the animation starts (in milliseconds). Defaults to0
..reduceMotion(reduceMotion: ReduceMotion)
determines how the animation responds to the device's reduced motion accessibility setting..withCallback(callback: (finished: boolean) => void)
is the callback that will fire after the animation ends. Setsfinished
totrue
when animation ends without interruptions, andfalse
otherwise.
Example
Curved Transition
Curved transition enables animation of all parameters (X
, Y
, width
, height
) with different easing each. It makes component movement path look curved.
Reference
import { CurvedTransition } from 'react-native-reanimated';
function App() {
return <Animated.View layout={CurvedTransition} />;
}
Modifiers
CurvedTransition.duration(1000)
.delay(500)
.easingX(Easing.in(Easing.exp))
.easingY(Easing.out(Easing.quad))
.easingWidth(Easing.in(Easing.ease))
.easingHeight(Easing.out(Easing.exp))
.reduceMotion(ReduceMotion.Never)
.withCallback((finished) => {
console.log(`finished without interruptions: ${finished}`);
});
.duration(duration: number)
sets length of the animation (in milliseconds). Defaults to '300'..delay(duration: number)
is the delay before the animation starts (in milliseconds). Defaults to0
..easingX(easing: EasingFunction)
defines easing animation for x-position..easingY(easing: EasingFunction)
defines easing animation for y-position..easingWidth(easing: EasingFunction)
defines easing animation for width..easingHeight(easing: EasingFunction)
defines easing animation for height..reduceMotion(reduceMotion: ReduceMotion)
determines how the animation responds to the device's reduced motion accessibility setting..withCallback(callback: (finished: boolean) => void)
is the callback that will fire after the animation ends. Setsfinished
totrue
when animation ends without interruptions, andfalse
otherwise.
Remarks
- Length of the duration is shared for all of the easings.
Example
Entry/Exit Transition
Entry/Exit transition lets you choose layout animations for entering and exiting. It combines both of them into a one and applies to the layout. Moreover, instead of picking currently available animations, you are welcome to create your own one.
Reference
import { EntryExitTransition } from 'react-native-reanimated';
function App() {
return <Animated.View layout={EntryExitTransition} />;
}
Modifiers
EntryExitTransition.duration(1000)
.delay(500)
.entering(FlipInEasyX)
.exiting(FlipOutEasyY)
.reduceMotion(ReduceMotion.Never)
.withCallback((finished) => {
console.log(`finished without interruptions: ${finished}`);
});
.duration(duration: number)
sets length of the animation (in milliseconds). Default depends on entry/exit animation..delay(duration: number)
is the delay before the animation starts (in milliseconds). Defaults to0
..exiting(animation)
determines animation shown when element is removed from position. Defaults toFadeOut
..entering(animation)
determines animation shown when element is added to new position. Defaults toFadeIn
..reduceMotion(reduceMotion: ReduceMotion)
determines how the animation responds to the device's reduced motion accessibility setting..withCallback(callback: (finished: boolean) => void)
is the callback that will fire after the animation ends. Setsfinished
totrue
when animation ends without interruptions, andfalse
otherwise.
Remarks
- Duration equals sum of entering and exiting durations.
Example
Platform compatibility
Android | iOS | Web |
---|---|---|
✅ | ✅ | ✅ |