La animación en aplicaciones móviles las hace vivas y receptivas, dirigiendo la atención del usuario y mejorando la percepción de la interfaz. En este artículo analizaremos los principales tipos de animaciones en iOS y Android: Property Animation, View Animation, UIKit Dynamics, Core Animation, Lottie, Rive, Spring Animation, Hero Animation y Shared Element Transition. El material ayudará a los desarrolladores principiantes a comprender qué herramientas y bibliotecas elegir para una tarea específica. Más detalles — en la documentación oficial de Android Animations.
Puntos clave
Android proporciona dos sistemas principales de animación: View Animation (heredado) y Property Animation (moderno). View Animation (o Tween Animation) funciona solo con la representación visual — cambia la visualización de la Vista pero no sus propiedades reales (por ejemplo, las coordenadas de clic permanecen en su lugar). Property Animation, introducida en Android 3.0, cambia las propiedades reales del objeto a través de Animator — ValueAnimator, ObjectAnimator o AnimatorSet.
ObjectAnimator es la clase más popular de Property Animation. Anima una propiedad específica del objeto (por ejemplo, translationX, alpha, scaleY) durante un tiempo determinado con un Interpolator dado.
ObjectAnimator.ofFloat(myView, "translationX", 0f, 300f).apply {
duration = 500
interpolator = FastOutSlowInInterpolator()
startDelay = 200
}.start()
ValueAnimator no está vinculado a un objeto específico — genera valores que se pueden usar para cualquier propiedad o lógica personalizada.
View Animation se describe en archivos XML res/anim/. Se admiten cuatro tipos: scale, translate, rotate, alpha. La desventaja es que la animación no cambia los parámetros reales de la Vista. Para efectos simples (parpadeo, rotación) View Animation sigue siendo aplicable, pero para nuevos proyectos se recomienda Property Animation.
Jetpack Compose ofrece una API de animación moderna: animateAsState, Animatable, AnimatedVisibility y AnimatedContent. La animación en Compose es reactiva: cuando el estado cambia, la animación se inicia automáticamente.
var expanded = remember { mutableStateOf(false) }
val size = animateAsState(
if (expanded) 200f else 50f
)
Box(
modifier = Modifier
.size(size.value, size.value)
.clickable { expanded = !expanded }
.background(Color.Blue)
)
iOS proporciona un potente stack de animación basado en Core Animation — un framework de bajo nivel que trabaja con CALayer. UIKit se construye sobre Core Animation con métodos convenientes UIView.animate y UIViewPropertyAnimator.
UIView.animate es la forma más simple de animar en iOS. Permite animar frame, alpha, transform, backgroundColor y otras propiedades de UIView.
UIView.animate(
withDuration: 0.5,
delay: 0.2,
usingSpringWithDamping: 0.6,
initialSpringVelocity: 1.0,
options: [.curveEaseInOut]
) {
myView.frame.origin.x += 300
myView.alpha = 0.5
}
UIKit Dynamics — un framework para animación física: gravedad, colisiones, resortes, fuerzas de atracción. Permite crear comportamientos realistas de objetos sin cálculo manual de física. Se utiliza para transiciones personalizadas, menús animados y elementos de juego.
Core Animation (CAAnimation, CABasicAnimation, CAKeyframeAnimation) — una API de bajo nivel para la animación de CALayer. Admite transformaciones 3D, animación de trayectoria (keyframe), enmascaramiento y composición. SwiftUI utiliza Core Animation internamente a través de los modificadores animation y withAnimation.
let animation = CABasicAnimation(keyPath: "transform.rotation.z")
animation.fromValue = 0
animation.toValue = CGFloat.pi * 2
animation.duration = 1.0
animation.repeatCount = .infinity
myLayer.add(animation, forKey: "rotation")
Para la mayoría de los proyectos en iOS se utiliza SwiftUI con su animación incorporada. Por ejemplo, withAnimation envuelve los cambios de estado en un contexto animado.
Las animaciones complejas (personajes, transiciones, cargadores) son difíciles de implementar con código. Lottie y Rive resuelven este problema permitiendo a los diseñadores crear animaciones en editores visuales y a los desarrolladores integrarlas en la aplicación como un componente listo.
Lottie — una biblioteca de Airbnb (ahora LottieFiles) que renderiza animaciones de Adobe After Effects exportadas en formato JSON. Compatible con Android, iOS, Flutter, React Native y Web. Las animaciones de Lottie son vectoriales, se escalan sin pérdida de calidad y se pueden personalizar mediante programación (velocidad, progreso, colores).
// Android import com.airbnb.lottie.LottieAnimationView val lottieView = findViewById<LottieAnimationView>(R.id.lottieView) lottieView.setAnimation(R.raw.loading_animation) lottieView.playAnimation()
Rive (anteriormente 2Dimensions) — una herramienta más avanzada para animación vectorial. A diferencia de Lottie, Rive admite animación interactiva: estados, disparadores, transiciones. La animación se crea en Rive Editor y se controla en la aplicación a través de State Machine. Rive es adecuado para interfaces de juego, iconos animados y transiciones complejas con retroalimentación.
En IT Sectr usamos Lottie para animaciones decorativas (cargadores, operaciones exitosas, estados vacíos) y Rive para elementos interactivos de pantallas de onboarding. Esto reduce el tiempo de desarrollo de animaciones en un 60% en comparación con la implementación manual en UIKit o Canvas.
Shared Element Transition — animación en la que un elemento (imagen, texto, tarjeta) se mueve y transforma suavemente al hacer transición entre pantallas. Esto crea la ilusión de continuidad: el usuario no "va" a una nueva pantalla, sino que "se sumerge" en el elemento.
En Android, la transición se implementa a través de ActivityOptionsCompat y atributos transitionName. FragmentTransaction admite addSharedElement para transiciones dentro de Activity. Compose utiliza SharedTransitionLayout con SharedContentState.
iOS no tiene una transición Hero incorporada, pero la biblioteca Hero (de Luke Zhao) implementa este patrón en UIKit. Simplemente asigne un id a los elementos en ambas pantallas — Hero creará automáticamente una transición suave. En SwiftUI, la animación de transición está integrada a través de NavigationStack y matchedGeometryEffect.
Flutter tiene un widget Hero incorporado con un parámetro tag. Cuando dos páginas contienen Hero con el mismo tag, Flutter anima automáticamente la transición entre ellas. Esta es una de las formas más simples de implementar animación compleja en una aplicación móvil.
Hero( tag: 'profile_avatar', child: CircleAvatar( backgroundImage: AssetImage('avatar.jpg'), radius: 50, ), )
Para que la animación se vea natural, se utilizan curvas de velocidad — Interpolator en Android y Easing en iOS. Determinan cómo cambia la velocidad de la animación desde el inicio hasta el final.
Android admite varios Interpoladores incorporados: LinearInterpolator (uniforme), AccelerateDecelerateInterpolator (lento-rápido-lento), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (con sobrepaso) y BounceInterpolator (con rebote). Se puede crear un Interpolator personalizado a través de XML o la clase TimeInterpolator.
| Interpolator | Comportamiento | Uso |
|---|---|---|
| LinearInterpolator | Velocidad constante | Indicadores de carga, rotaciones infinitas |
| FastOutSlowInInterpolator | Inicio rápido, final suave | Material Design, aparición de tarjetas |
| OvershootInterpolator | Sobrepasa el objetivo y regresa | Elementos de acento, botones |
| BounceInterpolator | Rebote al final | Listas, pull-to-refresh |
Spring Animation (animación de resorte) modela la física del resorte con parámetros damping (amortiguación) y stiffness (rigidez). Damping 0 — oscilaciones infinitas, 1 — sin oscilaciones. Stiffness determina la velocidad de retorno. Spring Animation está disponible en iOS (UIViewPropertyAnimator con UISpringTimingParameters), Android (SpringAnimation de physics2) y SwiftUI (spring()).
La documentación de Spring Animation en Android contiene ejemplos detallados de configuración.
Timeline (línea de tiempo) — un enfoque en el que la animación se divide en fotogramas a lo largo del tiempo. Se utiliza para secuencias complejas donde AnimationSet o Group no son suficientemente flexibles. Android admite AnimatorSet, iOS — CAAnimationGroup, Flutter — Interval en AnimationController.
Часто задаваемые вопросы
View Animation (Android) cambia solo la visualización de una Vista sin cambiar propiedades reales (la posición de clic no cambia). Property Animation cambia las propiedades reales del objeto, proporcionando un comportamiento más flexible y predecible. Para proyectos nuevos, use siempre Property Animation.
Hero Animation es una animación en la que un elemento se mueve y transforma suavemente al hacer transición entre pantallas, creando la ilusión de continuidad. Se implementa a través de Hero (Flutter), SharedElementTransition (Android) o matchedGeometryEffect (SwiftUI).
Lottie y Rive son bibliotecas para renderizar animaciones vectoriales en tiempo de ejecución. El diseñador crea la animación en After Effects (Lottie) o Rive Editor, la exporta a JSON, y el desarrollador la integra sin escribir código de animación manualmente.
Spring Animation modela la física del resorte: la animación tiene amortiguación natural y "rebote". SwiftUI y Jetpack Compose admiten animaciones spring de forma nativa, haciendo la interfaz más viva y receptiva.
La elección depende del contexto: FastOutSlowIn — para aparición de elementos, Overshoot — para acentos, Linear — para indicadores de carga, Bounce — para listas. Material Design recomienda curvas estándar: standard easing, deceleration easing y acceleration easing.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.