10 ejemplos para comenzar con animaciones en React Native - 7 básicos e intermedios. Aprenderás cuándo la API integrada Animated es suficiente, cuándo Reanimated 4 es la herramienta correcta, y cómo mantener el movimiento a 60fps en el hilo de la UI.
El plugin de Babel de Reanimated reescribe worklets en tiempo de compilación. Debe ser el plugin final en el array.
// babel.config.jsmodule.exports = function (api) { api.cache(true); return { presets: ["babel-preset-expo"], plugins: [ // otros plugins primero … "react-native-reanimated/plugin", // ← siempre último ], };};
Si el plugin falta o no está último, los worklets lanzan una excepción en tiempo de ejecución y las animaciones retroceden silenciosamente al hilo de JS.
Después de cambiar babel.config.js, reinicia Metro con caché borrado: npx expo start --clear.
La plantilla default@sdk-57 incluye esta configuración - verifica antes de copiar fragmentos de tutoriales más antiguos.
Las propiedades que afectan el layout permanecen en el hilo de JS con la API clásica Animated.
Familia de propiedades
useNativeDriver: true
Mejor enfoque
opacity, transform
✅ Admitido
Animated o Reanimated
width, height, top, left
❌ No admitido
Animaciones de layout de Reanimated o Layout
backgroundColor
❌ No admitido
Reanimated useAnimatedStyle + interpolateColor
Cambios de flex
❌ No admitido
Reanimated Layout o estructura condicional
// ❌ Esto advierte y se ejecuta en el hilo de JS - jank durante scrollAnimated.timing(width, { toValue: 200, useNativeDriver: true });// ✅ Reanimated 4 - animación consciente del layout en el hilo de UIimport Animated, { useAnimatedStyle, useSharedValue, withTiming } from "react-native-reanimated";const progress = useSharedValue(0);const style = useAnimatedStyle(() => ({ width: withTiming(progress.value * 200),}));
La frontera del driver nativo es la razón principal por la que los equipos adoptan Reanimated para movimiento en producción.
Animar layout en el hilo de JS durante scroll de lista es una fuente común de fotogramas perdidos.
Relacionado:Layout Animations - Layout, FadeIn y reorden de lista sin tweens de ancho manual
Regla general: Si la animación sigue a un dedo o se ejecuta mientras un FlatList se desplaza, usa Reanimated 4. Si es una transición corta y olvidable en una pantalla estática, Animated es aceptable.
Entender dónde se ejecutan los fotogramas previene "jank misterioso" en producción.
Hilo de JS (React) Hilo de UI (nativo)────────────────── ────────────────────Renderizado de React → commit Reconocimiento de gestossetState cada fotograma ❌ Actualizaciones de valores compartidos ✅Animated sin driver nativo ❌ useAnimatedStyle ✅Lógica empresarial, networking withTiming / withSpring
// ❌ Se ejecuta en hilo de JS - compite con reconciliación de Reactconst [offset, setOffset] = useState(0);onPanResponderMove: (_, g) => setOffset(g.dx);// ✅ Se ejecuta en hilo de UI - 60fps incluso durante trabajo JS pesadoconst translateX = useSharedValue(0);Gesture.Pan().onUpdate((e) => { translateX.value = e.translationX;});
60fps significa 16.7ms por fotograma - una renderización JS cara durante un pan deja caer un fotograma visiblemente.
Usa React DevTools y el monitor de hilo de JS; usa el registro de depuración de Reanimated para problemas de worklet.
Perfila en un dispositivo Android de gama media - los simuladores de iPhone Pro ocultan contención de hilo de JS.