For a long time, animation work in React Native often started with the built-inAnimatedAPI. It can still be the right tool, but there is an important constraint to understand: animation code that depends on the JavaScript thread can compete with the rest of the app.
The JavaScript thread already has plenty to do. It runs component code, handles state updates, processes events, and reacts to network responses.
If an animation depends on that same thread while the app is busy rendering or running business logic, frames can be missed.
At 60 frames per second, each frame has about 16 milliseconds to be ready. Miss that window often enough and the animation looks uneven.
A one-second animation may still complete in roughly one second, but it will not feel smooth.
The useNativeDriver option helped by letting some animations run on the native side. It is especially useful for properties such as opacity and transform.
The limitation is that it does not apply to every style property, especially layout-related properties, and every animation using a given animated value needs to stay consistent about which driver it uses.
That history explains why some teams became cautious about animation. The problem was rarely that animation was impossible.
The problem was that smooth animation required knowing which work could stay away from the busy JavaScript thread.