El desarrollo de la interfaz de una aplicación móvil comienza con la comprensión de los componentes UI y los frameworks. Este artículo cubre Material Design, Human Interface Guidelines, SwiftUI, Jetpack Compose, Flutter Widgets, el sistema de unidades de medida (dp, sp, pt, px) y todos los elementos clave de la UI — desde NavigationView y RecyclerView hasta Safe Area y Dark Mode. El material está dirigido a principiantes que pasan de la teoría a sus primeros proyectos. Para más detalles, consulte la documentación oficial de Material Design.
Puntos clave
Cada plataforma ofrece su propio conjunto de reglas y componentes. Para Android, esto es Material Design, desarrollado por Google en 2014. Material Design utiliza la metáfora del material físico — capas, sombras (Elevation), transiciones animadas y diseños adaptativos. Los principios clave incluyen jerarquía mediante elevación, movimiento significativo y adaptabilidad a diferentes factores de forma. Recomendamos explorar Material Design 3 (Material You) — la última versión con tema dinámico y colores personalizados.
Apple ofrece Human Interface Guidelines (HIG) — un conjunto de reglas para iOS, iPadOS, macOS, watchOS y tvOS. HIG enfatiza la tipografía clara (San Francisco), Safe Area para tener en cuenta el Notch y Dynamic Island, navegación basada en gestos y consistencia. A diferencia de Material Design, HIG no usa "capas" ni Elevation — en su lugar, utiliza desenfoque (vibrancy), sombras y separadores sutiles. La documentación completa de HIG se actualiza regularmente con nuevas versiones de iOS.
En IT Sectr, utilizamos ambos sistemas de diseño según la plataforma del cliente. Para proyectos multiplataforma con Flutter, desarrollamos un sistema de diseño unificado que combina las mejores prácticas de Material Design y HIG. Este enfoque preserva una UX nativa en cada plataforma sin duplicación de código.
El enfoque tradicional para construir UI es el diseño imperativo mediante XML (Android) o Interface Builder / código (iOS). La alternativa moderna son los frameworks declarativos, donde el desarrollador describe cómo debe verse la interfaz en cada estado, y el framework se encarga de las actualizaciones.
Jetpack Compose es un toolkit moderno de Google para construir UI nativa en Kotlin. En lugar de diseños XML, se utilizan funciones componibles de Kotlin (@Composable). Compose es completamente declarativo: cuando los datos cambian, solo se redibujan las partes modificadas de la pantalla. Ejemplo de una pantalla simple con texto y un botón:
@Composable
fun GreetingScreen() {
var count = remember { mutableStateOf(0) }
Column {
Text(text = "Нажато: $count")
Button(onClick = { count++ }) {
Text("Нажми меня")
}
}
}
SwiftUI es el framework declarativo de Apple presentado en 2019. Funciona en todas las plataformas Apple (iOS, iPadOS, macOS, watchOS, tvOS) a través de una API unificada. SwiftUI utiliza estructuras View, propiedades @State y @Binding para la gestión de datos, y modificadores para el estilo. El equivalente del ejemplo anterior en SwiftUI:
struct GreetingView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Нажато: \(count)")
Button("Нажми меня") {
count += 1
}
}
}
}
Flutter de Google utiliza su propia biblioteca de widgets. Todo en Flutter es un widget — desde el padding hasta una pantalla completa. Los widgets se dividen en StatelessWidget (inmutables) y StatefulWidget (con estado). Los contenedores básicos son Container, Row, Column, Stack. Flutter no utiliza componentes nativos de la plataforma — dibuja todo a través de Skia Engine, lo que garantiza una apariencia consistente tanto en Android como en iOS.
class GreetingWidget extends StatefulWidget {
@override
State createState() => _GreetingWidgetState();
}
class _GreetingWidgetState extends State<GreetingWidget> {
int count = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Нажато: $count'),
ElevatedButton(
onPressed: () => setState(() => count++),
child: Text('Нажми меня'),
),
],
);
}
}
A pesar de la expansión de los frameworks declarativos, comprender los componentes nativos sigue siendo importante para mantener proyectos heredados y realizar personalizaciones profundas.
La navegación en Android se basa en Activity (pantallas de actividad) y Fragment (fragmentos dentro de una Activity). Jetpack Navigation Component simplifica las transiciones entre pantallas mediante un grafo de navegación. En iOS, la navegación se implementa a través de NavigationController — una pila de controladores con transiciones animadas. Tab Bar y Bottom Navigation permiten cambiar entre las secciones principales de la aplicación. Drawer (menú lateral) y Toolbar/ActionBar se utilizan para acciones adicionales. Android Navigation Component se recomienda para todos los proyectos nuevos.
Para mostrar grandes cantidades de datos, Android utiliza RecyclerView — un contenedor eficiente con reutilización de ViewHolder. Los equivalentes en iOS son UITableView (listas verticales) y UICollectionView (cuadrículas). Jetpack Compose ofrece LazyColumn y LazyVerticalGrid, mientras que SwiftUI proporciona List y LazyVStack/LazyHStack. La ventaja clave de los componentes Lazy es que renderizan solo los elementos visibles.
| Plataforma | Componente de lista | Componente de cuadrícula | Carga diferida |
|---|---|---|---|
| Android (View System) | RecyclerView + ListView | RecyclerView GridLayoutManager | Sí |
| Android (Compose) | LazyColumn | LazyVerticalGrid | Sí |
| iOS (UIKit) | UITableView | UICollectionView | Sí |
| iOS (SwiftUI) | List / LazyVStack | LazyVGrid | Sí |
| Flutter | ListView.builder | GridView.builder | Sí |
El sistema de vistas de Android ofrece varios contenedores de diseño: ConstraintLayout (sistema flexible de restricciones), LinearLayout (disposición lineal), RelativeLayout (posicionamiento relativo), FrameLayout (superposición de capas). En iOS, Core Auto Layout utiliza un sistema de restricciones (NSLayoutConstraint) para describir la posición de los elementos. SwiftUI y Flutter utilizan VStack/HStack/ZStack y Row/Column/Stack respectivamente.
Los componentes de UI de dispositivos móviles se muestran teniendo en cuenta diferentes densidades de píxeles. Para que la interfaz se vea igual en todas las pantallas, se utilizan unidades independientes de densidad.
| Unidad | Plataforma | Descripción |
|---|---|---|
| dp | Android | Density-independent Pixels — unidad abstracta equivalente a 1px en una pantalla mdpi |
| sp | Android | Scale-independent Pixels — para fuentes, respeta la configuración de tamaño de texto del usuario |
| pt | iOS | Points — unidad tipográfica, 1pt = 1px en una pantalla 1x (no Retina) |
| px | Todas | Píxeles físicos de la pantalla — no recomendado para diseño debido a la densidad variable |
Las densidades de pantalla se clasifican como: mdpi (160 dpi, 1x), hdpi (240 dpi, 1.5x), xhdpi (320 dpi, 2x), xxhdpi (480 dpi, 3x), xxxhdpi (640 dpi, 4x). Al preparar imágenes, debe crear recursos para todas las densidades: icon.png, icon_hdpi.png, icon_xhdpi.png, etc. Los formatos vectoriales (VectorDrawable en Android, SF Symbols en iOS) resuelven el problema de múltiples recursos rasterizados.
En IT Sectr, utilizamos un factor de escala para exportar iconos desde Figma: exportamos a 1x, 2x, 3x para iOS y mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi para Android. Esto garantiza una visualización nítida en todos los dispositivos, incluidas tabletas y teléfonos plegables.
Los componentes de UI de aplicaciones móviles modernas deben admitir una serie de estándares, sin los cuales la experiencia del usuario sería incompleta.
Dark Mode (modo oscuro) es una opción obligatoria en las aplicaciones modernas. Material Design 3 e iOS 13+ ofrecen soporte integrado para el tema oscuro. Es importante no invertir los colores, sino usar paletas de colores separadas: fondo oscuro, texto claro, contraste reducido para elementos secundarios. El cambio automático se puede vincular al tema del sistema del dispositivo.
Los iPhones modernos tienen un Notch (recorte para la cámara frontal) y Dynamic Island. Los dispositivos Android también tienen recortes y esquinas redondeadas (Corner Radius). Safe Area es el área de la pantalla que está garantizada libre de elementos del sistema (barra de estado, indicador de inicio), barra de navegación y recortes. iOS aplica automáticamente Safe Area Insets; Android requiere verificación explícita mediante WindowInsets o DisplayCutout.
Accesibilidad garantiza que la aplicación sea utilizable por personas con discapacidades. Requisitos clave: soporte para TalkBack (Android) y VoiceOver (iOS), contentDescription correcto para ImageView, contraste de color suficiente (mínimo 4.5:1 para texto), soporte de Dynamic Type (iOS) para escalado de fuentes, navegación sin visión y alternativas a gestos. WCAG 2.1 es el estándar internacional de accesibilidad.
Internacionalización (i18n) es preparar la aplicación para admitir múltiples idiomas y formatos regionales. Localización (l10n) es traducir cadenas, fechas, monedas y características culturales. Android utiliza directorios de recursos (values-ru, values-de), iOS utiliza Localizable.strings y XLIFF. Flutter admite flutter_localizations con archivos de traducción ARB.
La interacción táctil incluye muchos gestos: Tap (toque), Long Press (pulsación larga), Swipe (deslizar), Pinch-to-Zoom (pellizcar para ampliar), Pull-to-Refresh (deslizar para actualizar), Drag-and-Drop (arrastrar y soltar). Android utiliza GestureDetector, iOS utiliza UIGestureRecognizer. iOS también admite 3D Touch (Force Touch) y Haptic Touch con retroalimentación háptica a través del Taptic Engine.
Preguntas frecuentes
Material Design (Google) utiliza una metáfora "material" con sombras, capas y transiciones animadas, mientras que HIG (Apple) se basa en claridad, Safe Area y Dynamic Type. Material Design se recomienda para Android, HIG para iOS. La elección del sistema de diseño también afecta la navegación: Android favorece Bottom Navigation y Navigation Drawer, mientras que iOS favorece Tab Bar y Navigation Controller.
Jetpack Compose es un framework declarativo para Android, SwiftUI es para iOS. Ambos utilizan un enfoque declarativo y simplifican el desarrollo de UI. Compose está más integrado con Kotlin y Android Architecture Components, SwiftUI con Combine y todo el ecosistema Apple.
El diseño responsive es un enfoque donde la interfaz se adapta al tamaño de la pantalla, la orientación y la densidad de píxeles. Se utilizan unidades relativas (dp, sp, pt), Auto Layout o ConstraintLayout. Las tabletas, dispositivos plegables y ventanas de escritorio (iPad Stage Manager) requieren adaptaciones adicionales: Split View, diseño maestro-detalle.
dp (density-independent pixels) y sp (scale-independent pixels) en Android, pt (points) en iOS. px son píxeles físicos. dp y pt proporcionan el mismo tamaño físico en diferentes densidades de pantalla: mdpi (1x), hdpi (1.5x), xhdpi (2x), xxhdpi (3x), xxxhdpi (4x).
La accesibilidad hace que la interfaz sea utilizable para personas con discapacidades: soporte de lectores de pantalla, texto grande, contraste. Sin a11y, una aplicación no será aceptada para su publicación en App Store o Google Play. Además, la accesibilidad mejora la UX para todos los usuarios — por ejemplo, el soporte de Dynamic Type ayuda a personas con baja visión.
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.