Разработка интерфейса мобильного приложения начинается с понимания UI-компонентов и фреймворков. В этой статье разберём Material Design, Human Interface Guidelines, SwiftUI, Jetpack Compose, Flutter Widgets, систему единиц измерения (dp, sp, pt, px) и все ключевые элементы UI — от NavigationView и RecyclerView до Safe Area и Dark Mode. Материал ориентирован на новичков, переходящих от теории к первым проектам. Подробнее — в официальной документации Material Design.
Главное
Каждая платформа предлагает собственный набор правил и компонентов. Для Android это Material Design, разработанный Google в 2014 году. Material Design использует метафору физического материала — слои, тени (Elevation), анимированные переходы и адаптивные макеты. Ключевые принципы включают иерархию через возвышение (Elevation), осмысленное движение и адаптивность под разные форм-факторы. Рекомендуем изучить Material Design 3 (Material You) — последнюю версию с динамической темой и персонализированными цветами.
Apple предлагает Human Interface Guidelines (HIG) — свод правил для iOS, iPadOS, macOS, watchOS и tvOS. HIG делает акцент на чёткой типографике (San Francisco), Safe Area для учёта Notch и Dynamic Island, жестовой навигации и консистентности. В отличие от Material Design, HIG не использует «слои» и Elevation — вместо этого применяются размытие (vibrancy), тени и аккуратные разделители. Полная документация HIG регулярно обновляется с выходом новых версий iOS.
В IT Sectr мы используем обе дизайн-системы в зависимости от платформы заказчика. Для кроссплатформенных проектов на Flutter разрабатываем единую дизайн-систему, сочетающую лучшие практики Material Design и HIG. Такой подход позволяет сохранить нативный UX на каждой платформе без дублирования кода.
Традиционный подход к построению UI — императивная верстка через XML (Android) или Interface Builder / код (iOS). Современная альтернатива — декларативные фреймворки, где разработчик описывает, как интерфейс должен выглядеть при каждом состоянии, а фреймворк заботится об обновлениях.
Jetpack Compose — современный тулкит от Google для построения нативного UI на Kotlin. Вместо XML-разметки используются Kotlin-функции-компонуемые (@Composable). Compose полностью декларативен: при изменении данных перерисовываются только изменившиеся части экрана. Пример простого экрана с текстом и кнопкой:
@Composable
fun GreetingScreen() {
var count = remember { mutableStateOf(0) }
Column {
Text(text = "Нажато: $count")
Button(onClick = { count++ }) {
Text("Нажми меня")
}
}
}
SwiftUI — декларативный фреймворк Apple, представленный в 2019 году. Работает на всех платформах Apple (iOS, iPadOS, macOS, watchOS, tvOS) через единый API. SwiftUI использует структуры View, свойства @State и @Binding для управления данными, а также модификаторы для настройки внешнего вида. Аналог примера выше на SwiftUI:
struct GreetingView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Нажато: \(count)")
Button("Нажми меня") {
count += 1
}
}
}
}
Flutter от Google использует собственную библиотеку виджетов. Всё в Flutter — виджет: от паддинга до целого экрана. Виджеты делятся на StatelessWidget (неизменяемые) и StatefulWidget (с состоянием). Базовые контейнеры — Container, Row, Column, Stack. Flutter не использует нативные компоненты платформы — он рисует всё через Skia Engine, что обеспечивает одинаковый вид на Android и 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('Нажми меня'),
),
],
);
}
}
Несмотря на распространение декларативных фреймворков, понимание нативных компонентов остаётся важным для поддержки легаси-проектов и глубокой кастомизации.
Навигация в Android строится на Activity (экраны-активности) и Fragment (фрагменты внутри одной Activity). Jetpack Navigation Component упрощает переходы между экранами через граф навигации. В iOS навигация реализуется через NavigationController — стек контроллеров с анимированными переходами. Tab Bar и Bottom Navigation обеспечивают переключение между основными разделами приложения. Drawer (боковое меню) и Toolbar/ActionBar используются для дополнительных действий. Android Navigation Component рекомендуется для всех новых проектов.
Для отображения больших объёмов данных Android использует RecyclerView — эффективный контейнер с переиспользованием ViewHolder. В iOS аналогом служат UITableView (вертикальные списки) и UICollectionView (сетки). Jetpack Compose предлагает LazyColumn и LazyVerticalGrid, а SwiftUI — List и LazyVStack/LazyHStack. Ключевое преимущество Lazy-компонентов — отрисовка только видимых элементов.
| Платформа | Компонент списка | Компонент сетки | Ленивая загрузка |
|---|---|---|---|
| Android (View System) | RecyclerView + ListView | RecyclerView GridLayoutManager | Да |
| Android (Compose) | LazyColumn | LazyVerticalGrid | Да |
| iOS (UIKit) | UITableView | UICollectionView | Да |
| iOS (SwiftUI) | List / LazyVStack | LazyVGrid | Да |
| Flutter | ListView.builder | GridView.builder | Да |
Android View System предлагает несколько Layout-контейнеров: ConstraintLayout (гибкая система привязок), LinearLayout (линейное расположение), RelativeLayout (относительное позиционирование), FrameLayout (наложение слоёв). В iOS Core Auto Layout использует систему констрейнтов (NSLayoutConstraint) для описания расположения элементов. SwiftUI и Flutter используют VStack/HStack/ZStack и Row/Column/Stack соответственно.
UI-компоненты мобильных устройств отображаются с учётом разной плотности пикселей. Чтобы интерфейс выглядел одинаково на всех экранах, используются независимые единицы измерения.
| Единица | Платформа | Описание |
|---|---|---|
| dp | Android | Density-independent Pixels — абстрактная единица, равная 1px на экране mdpi |
| sp | Android | Scale-independent Pixels — для шрифтов, учитывает настройки размера текста пользователя |
| pt | iOS | Points — типографская единица, 1pt = 1px на экране 1x (не Retina) |
| px | All | Физические пиксели экрана — не рекомендуется для вёрстки из-за разной плотности |
Плотности экрана классифицируются: mdpi (160 dpi, 1x), hdpi (240 dpi, 1.5x), xhdpi (320 dpi, 2x), xxhdpi (480 dpi, 3x), xxxhdpi (640 dpi, 4x). При подготовке изображений нужно создавать ресурсы для всех плотностей: icon.png, icon_hdpi.png, icon_xhdpi.png и так далее. Векторные форматы (VectorDrawable в Android, SF Symbols в iOS) решают проблему множества растро-ресурсов.
В IT Sectr мы используем коэффициент масштабирования для экспорта иконок из Figma: экспортируем в 1x, 2x, 3x для iOS и mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi для Android. Это гарантирует чёткое отображение на всех устройствах включая планшеты и складные смартфоны.
Современные UI-компоненты мобильных приложений обязаны поддерживать ряд стандартов, без которых пользовательский опыт будет неполным.
Dark Mode (тёмная тема) — обязательная опция в современных приложениях. Material Design 3 и iOS 13+ предоставляют встроенную поддержку тёмной темы. Важно не инвертировать цвета, а использовать отдельные цветовые палитры: тёмный фон, светлый текст, пониженный контраст для второстепенных элементов. Автоматическое переключение можно привязать к системной теме устройства.
Современные iPhone имеют Notch (вырез под фронтальную камеру) и Dynamic Island. Android-устройства также имеют вырезы и скруглённые углы (Corner Radius). Safe Area — область экрана, гарантированно свободная от системных элементов (статус-бар, индикатор home), навигационной панели и вырезов. iOS автоматически применяет Safe Area Insets; Android требует явной проверки через WindowInsets или DisplayCutout.
Accessibility обеспечивает доступность приложения для людей с ограниченными возможностями. Ключевые требования: поддержка TalkBack (Android) и VoiceOver (iOS), корректные contentDescription для ImageView, достаточный цветовой контраст (минимум 4.5:1 для текста), поддержка Dynamic Type (iOS) для масштабирования шрифтов, навигация без зрения и альтернативы жестам. WCAG 2.1 — международный стандарт доступности.
Интернационализация (i18n) — подготовка приложения к поддержке нескольких языков и региональных форматов. Локализация (l10n) — перевод строк, дат, валют и культурных особенностей. Android использует ресурсные каталоги (values-ru, values-de), iOS — Localizable.strings и XLIFF. Flutter поддерживает flutter_localizations с ARB-файлами переводов.
Сенсорное взаимодействие включает множество жестов: Tap (касание), Long Press (долгое нажатие), Swipe (смахивание), Pinch-to-Zoom (масштабирование), Pull-to-Refresh (обновление потягиванием), Drag-and-Drop (перетаскивание). Android использует GestureDetector, iOS — UIGestureRecognizer. В iOS также доступны 3D Touch (Force Touch) и Haptic Touch с тактильной обратной связью через Taptic Engine.
Часто задаваемые вопросы
Material Design (Google) использует «материальную» метафору с тенями, слоями и анимированными переходами, а HIG (Apple) опирается на чистоту, Safe Area и Dynamic Type. Material Design рекомендован для Android, HIG — для iOS. Выбор дизайн-системы также влияет на навигацию: в Android преобладает Bottom Navigation и Navigation Drawer, в iOS — Tab Bar и Navigation Controller.
Jetpack Compose — декларативный фреймворк для Android, SwiftUI — для iOS. Оба используют декларативный подход и упрощают разработку UI. Compose теснее интегрирован с Kotlin и Android Architecture Components, SwiftUI — с Combine и всей экосистемой Apple.
Адаптивный дизайн — подход, при котором интерфейс подстраивается под размер экрана, ориентацию и плотность пикселей. Используются относительные единицы (dp, sp, pt), Auto Layout или ConstraintLayout. Планшеты, складные устройства и десктопные окна (iPad Stage Manager) требуют дополнительных адаптаций: Split View, master-detail layout.
dp (density-independent pixels) и sp (scale-independent pixels) в Android, pt (points) в iOS. px — аппаратные пиксели. dp и pt обеспечивают одинаковый физический размер на разных плотностях экрана: mdpi (1x), hdpi (1.5x), xhdpi (2x), xxhdpi (3x), xxxhdpi (4x).
Accessibility — доступность интерфейса для людей с ограниченными возможностями: поддержка экранных дикторов, крупного текста, контраста. Без a11y приложение не будет допущено к публикации в App Store или Google Play. Кроме того, доступность улучшает UX для всех пользователей: например, поддержка Dynamic Type помогает людям с ослабленным зрением.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.