
UI
| https://m3.material.io/ | Material3 |
| https://m2.material.io/design/color/the-color-system.html | Material2 Color system |
| https://fonts.google.com/ | Google Fonts |
| https://fonts.google.com/icons | Google Icons |
| https://pictogrammers.com/library/mdi/ | Material Design Icons |
| https://www.color-name.com/hex | Name a Color |
| https://icon.kitchen/ | App Icon Generator |
| https://romannurik.github.io/AndroidAssetStudio/icons-app-shortcut.html | App Shortcut Icon Generator |
| https://mockuphone.com/ | Screenshots Device Mockups Generator |
XML
| https://developer.android.com/develop/ui/views/layout/declaring-layout |
| https://developer.android.com/reference/android/util/Xml |
Extensible Markup Language. Язык разметки, используемый для описания данных. В Android в основном используется для описания данных, связанных с UI.
<merge>
Упрощает макет, убирая лишний уровень вложенности. Дочерние элементы <merge> добавляются напрямую в родительский макет, без создания дополнительного контейнера. Это улучшает производительность и упрощает структуру.
<!-- layout/fragment_example.xml -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/example_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World" />
<Button
android:id="@+id/example_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me" />
</merge><include>
Используется для повторного использования макетов и упрощения их структуры. Он позволяет включать один макет в другой, что помогает избежать дублирования кода и улучшает читаемость и поддерживаемость вашего проекта.
<!-- layout/activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/fragment_example" />
</LinearLayout>Layers
Layer List
Позволяет накладывать несколько изображений друг на друга в виде слоев. Каждый слой можно настроить по размеру, положению и порядку наложения.
• Слои отображаются в порядке их перечисления: первым идет самый нижний слой, последним — самый верхний.
• Если у слоя не указаны размеры, он займет весь доступный контейнер.
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/background"
android:drawable="@color/background_color"
android:padding="8dp" />
<item
android:drawable="@drawable/icon_shadow"
android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"
android:opacity="opaque" />
<item
android:drawable="@drawable/icon_main"
android:width="48dp"
android:height="48dp"
android:gravity="center"
android:visible="true" />
<item
android:drawable="@drawable/icon_overlay"
android:paddingLeft="4dp"
android:paddingTop="4dp"
android:paddingRight="4dp"
android:paddingBottom="4dp"
android:blendMode="src_over" />
</layer-list>imageView.setImageResource(R.drawable.layered_icon)• drawable указывает изображение или цвет для слоя.
• id задает уникальный идентификатор слоя.
• left отступ от левой стороны контейнера.
• top отступ от верхней стороны контейнера.
• right отступ от правой стороны контейнера.
• bottom отступ от нижней стороны контейнера.
• width задает ширину слоя (в dp).
• height задает высоту слоя (в dp).
• gravity указывает позиционирование слоя (например, center, left, right).
• padding задает общий отступ внутри слоя.
• paddingLeft отступ внутри слоя от левой стороны.
• paddingTop отступ внутри слоя от верхней стороны.
• paddingRight отступ внутри слоя от правой стороны.
• paddingBottom отступ внутри слоя от нижней стороны.
• opacity задает прозрачность слоя (opaque, translucent, transparent).
• visible определяет, отображается ли слой (true или false).
• blendMode указывает режим смешивания слоя (src_over, multiply, screen и другие).
State List
Позволяет отображать разные изображения в зависимости от состояния View. Порядок элементов важен: первым должен быть <item> с более специфичным состоянием.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/item_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/item_enabled" android:state_enabled="true" />
<item android:drawable="@drawable/item_disabled" android:state_enabled="false" />
<item android:drawable="@drawable/item_checked" android:state_checked="true" />
<item android:drawable="@drawable/item_selected" android:state_selected="true" />
<item android:drawable="@drawable/item_focused" android:state_focused="true" />
<item android:drawable="@drawable/item_activated" android:state_activated="true" />
<item android:drawable="@drawable/item_drag_can_accept" android:state_drag_can_accept="true" />
<item android:drawable="@drawable/item_drag_hovered" android:state_drag_hovered="true" />
<item android:drawable="@drawable/item_hovered" android:state_hovered="true" />
<item android:drawable="@drawable/item_window_focused" android:state_window_focused="true" />
<item android:drawable="@drawable/item_checkable" android:state_checkable="true" />
<item android:drawable="@drawable/item_multiline" android:state_multiline="true" />
<item android:drawable="@drawable/item_first" android:state_first="true" />
<item android:drawable="@drawable/item_last" android:state_last="true" />
<item android:drawable="@drawable/item_middle" android:state_middle="true" />
</selector>imageView.setImageResource(R.drawable.button_state_list)• state_pressed состояние нажатия.
• state_enabled элемент включен или отключен.
• state_checked находится в состоянии выбора (например, для CheckBox).
• state_selected выделена пользователем.
• state_focused находится в фокусе.
• state_activated активирована (например, для ListView).
• state_active обозначение активного элемента.
• state_drag_can_accept может принять перетаскиваемый объект.
• state_drag_hovered находится под перетаскиваемым объектом.
• state_hovered указатель (например, мышь) находится над элементом.
• state_window_focused окно, в котором находится элемент, в фокусе.
• state_checked_highlighted выбор элемента с дополнительной визуальной подсветкой.
• state_checkable поддерживает состояние выбора.
• state_multiline поддерживает многострочный текст.
• state_first первый элемент в группе.
• state_last последний элемент в группе.
• state_middle находится между первым и последним в группе.
Level List
Отображает разные изображения в зависимости от текущего уровня.
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/battery_empty" android:minLevel="0" android:maxLevel="20" />
<item android:drawable="@drawable/battery_low" android:minLevel="21" android:maxLevel="50" />
<item android:drawable="@drawable/battery_half" android:minLevel="51" android:maxLevel="80" />
<item android:drawable="@drawable/battery_full" android:minLevel="81" android:maxLevel="100" />
</level-list>imageView.setImageResource(R.drawable.battery_level_list)
imageView.drawable.level = 45• minLevel минимальный уровень, при котором изображение отображается.
• maxLevel максимальный уровень, при котором изображение отображается.
Bitmap
Изображение, представленное в виде пиксельных данных. В Android Bitmap используется для работы с изображениями (фото, иконки) и позволяет загружать, создавать и изменять растровые изображения.
val bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)Bitmap.Config
Определяет формат и качество хранения пиксельных данных в Bitmap. Выбор конфигурации влияет на количество памяти, занимаемой изображением, а также на поддерживаемые цветовые каналы и прозрачность.
• ALPHA_8 изображение с 8-битным альфа-каналом (прозрачность).
• RGB_565 изображение с 16-битными пикселями (5 бит красный, 6 бит зеленый, 5 бит синий). Меньше памяти, но без альфа-канала.
• ARGB_8888 изображение с 32-битными пикселями (по 8 бит на каждый канал: альфа, красный, зеленый, синий). Высокое качество, но больше занимает памяти.
• RGBA_F16 изображение с 16-битными значениями для каждого канала. Используется для изображений высокого качества.
• HARDWARE используется аппаратное ускорение для обработки изображения. Значительно повышает производительность, но не поддерживает прямое изменение пикселей через методы getPixel() и setPixel().
• RGBA_1010102 изображение с 10-битными значениями для каналов красного, зеленого и синего и 2-битным альфа-каналом. Используется для изображений высокого качества на устройствах с HDR-экраном.
createBitmap
Создает новый пустой Bitmap с заданной шириной, высотой и конфигурацией.
val bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888)copy
Создает копию текущего Bitmap с новой конфигурацией. Если isMutable = true, то копия будет изменяемой.
val bitmapCopy = bitmap.copy(Bitmap.Config.RGB_565, true)getWidth
Возвращают ширину Bitmap в пикселях.
val width = bitmap.widthgetHeight
Возвращают высоту Bitmap в пикселях.
val height = bitmap.heightgetPixel
Возвращает цвет пикселя по указанным координатам в виде значения Int.
val color = bitmap.getPixel(50, 50)setPixel
Устанавливает цвет пикселя по указанным координатам. Работает только для изменяемых Bitmap.
bitmap.setPixel(50, 50, Color.RED)compress
Сохраняет Bitmap в указанный поток в сжатом виде. Параметр quality определяет степень сжатия (0–100).
bitmap.compress(Bitmap.CompressFormat.PNG, 100, FileOutputStream("output.png"))recycle
Освобождает память, занятую Bitmap. Используется, когда изображение больше не нужно, чтобы избежать утечек памяти.
bitmap.recycle()isMutable
Возвращает true, если Bitmap можно изменять, и false, если изображение неизменяемое.
val isMutable = bitmap.isMutableeraseColor
Заполняет все пиксели Bitmap указанным цветом. Работает только для изменяемых изображений.
bitmap.eraseColor(Color.WHITE)hasAlpha
Возвращает true, если изображение поддерживает альфа-канал (прозрачность).
val supportsAlpha = bitmap.hasAlpha()extractAlpha
Создает новый Bitmap, содержащий только альфа-канал (прозрачность) исходного изображения.
val alphaBitmap = bitmap.extractAlpha()BitmapFactory
Используется для декодирования изображений из различных источников, таких как файлы, ресурсы, потоки или байтовые массивы, в объекты Bitmap.
decodeResource
Декодирует изображение из ресурсов по его идентификатору. Удобен для загрузки изображений, находящихся в папке res/drawable.
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.sample_image)decodeFile
Загружает изображение из файла по указанному пути.
val bitmap = BitmapFactory.decodeFile("/storage/emulated/0/Download/image.jpg")decodeStream
Декодирует изображение из потока данных. Полезен для загрузки изображений из сети или при чтении из файлового потока.
val inputStream = URL("https://example.com/image.png").openStream()
val bitmap = BitmapFactory.decodeStream(inputStream)
inputStream.close()decodeByteArray
Декодирует изображение из массива байтов. Используется, если изображение загружено в виде байтового массива, например, из базы данных.
val bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)Drawable
| https://developer.android.com/guide/topics/resources/drawable-resource |
Базовый класс для представления графических объектов, которые можно отображать на экране. Он используется для работы с изображениями, цветами и фигурами в интерфейсе.
BitmapDrawable
Используется для отображения растровых изображений (Bitmap) в Android. Он позволяет загружать, отображать и настраивать растровые изображения, например, управлять их масштабом или положением.
ShapeDrawable
Позволяет рисовать простые фигуры (прямоугольники, овалы, линии и т. д.).
LayerDrawable
Позволяет объединить несколько Drawable в один слой. Каждый слой может быть отрисован отдельно, с возможностью управления их положением и прозрачностью.
StateListDrawable
Позволяет отображать разные изображения (Drawable) в зависимости от состояния элемента интерфейса, например, нажатия, выделения или отключения.
NinePatchDrawable
Позволяет создавать растягиваемые изображения для фоновых элементов, кнопок или других UI-компонентов. Использует .9.png файлы, которые имеют встроенные данные для растяжения и заполнения.
VectorDrawable
Класс в Android для работы с векторными изображениями. Он позволяет описывать графику в виде XML-файлов с использованием форм, линий и цветов.
AnimationDrawable
Позволяет создавать анимации из последовательности изображений (кадров). Он используется для покадровой анимации, где каждое изображение отображается в течение заданного времени.
9-Patch
Растровые изображения, размер которых автоматически изменяется в соответствии с содержимым представления и размером экрана. Выбранные части изображения масштабируются по горизонтали или вертикали на основе индикаторов, нарисованных внутри изображения.
Density
Количество пикселей на единицу площади экрана устройства, обычно измеряется в dpi (dots per inch). В Android экраны делятся на несколько категорий плотности.
• ldpi (low) — 120 dpi
• mdpi (medium) — 160 dpi
• hdpi (high) — 240 dpi
• xhdpi (extra high) — 320 dpi
• xxhdpi (extra extra high) — 480 dpi
• xxxhdpi (extra extra extra high) — 640 dpi
dp
Density-independent pixels — единица измерения, которая используется для создания интерфейсов, независимых от плотности пикселей экрана. 1 dp эквивалентен 1 пикселю на экране с плотностью 160 dpi. Это помогает поддерживать стабильные размеры элементов интерфейса на устройствах с разной плотностью пикселей.
sp
Scale-independent pixels — единица измерения для текста в Android, которая учитывает настройки размера шрифта пользователя (например, для доступности). Используется для определения размеров текста, чтобы он корректно отображался на разных устройствах и при разных настройках экрана.
nodpi
Квалификатор, который используется для ресурсов, не зависящих от плотности пикселей экрана. Такие ресурсы будут одинаково отображаться на всех устройствах.
anydpi
Квалификатор для ресурсов, который используется на устройствах с любым разрешением экрана.
Strings
• Строки хранятся в ресурсах (файл strings.xml), что позволяет поддерживать интернационализацию.
<string name="app_name">My Application</string>Plurals
Ресурс, предназначенный для отображения текста с учётом числового значения, чтобы правильно склонять слова.
• Для ru-строк корректно будет работать только если в системе установлен русский язык.
<plurals name="item_count">
<item quantity="zero">Нет предметов</item>
<item quantity="one">%d предмет</item>
<item quantity="two">%d предмета</item>
<item quantity="few">%d предмета</item>
<item quantity="many">%d предметов</item>
<item quantity="other">%d предметов</item>
</plurals>val count = 3
val text = resources.getQuantityString(R.plurals.item_count, count, count)
textView.text = text• zero используется для значения 0.
• one используется для чисел 1, 21, 31 и т.д.
• two используется в некоторых языках (например, на арабском) для значения 2.
• few используется для чисел от 2 до 4 в русском языке.
• many используется для чисел от 5 до 20, а также для всех значений, кратных 10.
• other используется по умолчанию, если никакое другое правило не подходит.
LayoutInflater
Используется для преобразования XML-файлов разметки в соответствующие объекты View.
// Получаем LayoutInflater из контекста
val inflater = LayoutInflater.from(context)
// Используем inflater для создания View из XML
val view = inflater.inflate(R.layout.custom_view_layout, null)attachToRoot
Если вы используете LayoutInflater в производительном коде, например, в адаптерах RecyclerView, рекомендуется использовать метод inflate с параметром attachToRoot = false, чтобы избежать лишних операций и улучшить производительность.
val view = LayoutInflater.from(context).inflate(R.layout.my_layout, rootView, attachToRoot = true)AsyncLayoutInflater
Позволяет асинхронно инфлейтить XML-разметку. Это полезно для улучшения производительности и избегания блокировки основного потока приложения при создании сложных или ресурсозатратных пользовательских интерфейсов. Выполняется в фоновом потоке.
AsyncLayoutInflater(context).inflate(R.layout.my_layout, null) { inflatedView, _, _ ->
// Этот блок кода выполняется после завершения инфлейтации
// Вы можете использовать inflatedView для дальнейших операций
}Choreographer
Класс, который помогает синхронизировать обновления экрана и анимации с частотой обновления экрана (refresh rate). Он играет ключевую роль в обеспечении плавности анимаций и поддержке высокой производительности пользовательского интерфейса.
• Синхронизация с частотой обновления экрана. Choreographer обеспечивает, чтобы обновления и отрисовка экрана происходили синхронно с частотой обновления экрана, что помогает избегать мерцания и улучшает плавность анимаций.
• Планирование и обработка кадров. Класс управляет планированием и обработкой кадров в цикле отображения. Он гарантирует, что обновления пользовательского интерфейса и отрисовка происходят в нужное время.
• Методы для добавления задач. Choreographer предоставляет методы для добавления задач, которые будут выполняться до или после обновления экрана.
postFrameCallback
Позволяет добавить FrameCallback, который будет вызван перед следующим обновлением экрана. Это полезно для выполнения задач, которые должны быть синхронизированы с кадровой частотой, например, обновление анимаций.
Choreographer.getInstance().postFrameCallback(object: Choreographer.FrameCallback {
override fun doFrame(frameTimeNanos: Long) {
// Ваш код для обновления UI
Choreographer.getInstance().postFrameCallback(this) // Повторное добавление
}
})postCallback
Позволяет добавить Runnable (или Callback) для выполнения задачи в заданный момент времени, например, после обновления экрана.
Choreographer.getInstance().postCallback(
Choreographer.CALLBACK_ANIMATION,
Runnable {
// Ваш код для выполнения после обновления экрана
},
null
)SplashScreen
Предоставляет поддержку для создания экранов загрузки (splash screens) на устройствах, работающих на Android до версии 12 (API 31), а также упрощает реализацию сплэш-экранов на более поздних версиях. Она позволяет разработчикам легко и быстро настраивать сплэш-экраны с минимальными усилиями.
| https://developer.android.com/develop/ui/views/launch/splash-screen/migrate |
Theme.SplashScreen
Специальная тема, предоставляемая библиотекой SplashScreen Compat в Android, предназначенная для настройки внешнего вида сплэш-экрана вашего приложения. Она позволяет определять, как будет выглядеть сплэш-экран при запуске приложения.
<style name="Theme.App.Starting" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/splash_background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_animated_icon</item>
<item name="windowSplashScreenIconBackgroundColor">@color/icon_background</item>
<item name="windowSplashScreenAnimationDuration">500</item>
<item name="android:windowSplashScreenBrandingImage">@drawable/ic_branding_image</item>
<item name="postSplashScreenTheme">@style/Theme.App</item>
</style>windowSplashScreenBackground
Задает цвет фона сплэш-экрана.
<item name="windowSplashScreenBackground">@color/splash_background</item>windowSplashScreenAnimatedIcon
Определяет иконку, отображаемую на сплэш-экране.
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_animated_icon</item>windowSplashScreenIconBackgroundColor
Устанавливает цвет фона для иконки.
<item name="windowSplashScreenIconBackgroundColor">@color/icon_background</item>windowSplashScreenAnimationDuration
Задает продолжительность анимации сплэш-экрана в миллисекундах.
<item name="windowSplashScreenAnimationDuration">500</item>windowSplashScreenBrandingImage
Добавляет брендированное изображение.
<item name="android:windowSplashScreenBrandingImage">@drawable/ic_branding_image</item>postSplashScreenTheme
Определяет тему, которая будет применяться после показа сплэш-экрана.
<item name="postSplashScreenTheme">@style/Theme.App</item>installSplashScreen
Используется для установки и настройки SplashScreen в Activity, обеспечивая возможность кастомизации его поведения и внешнего вида.
class MainActivity: ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Устанавливаем экран загрузки
val splashScreen = installSplashScreen()
super.onCreate(savedInstanceState)
}
}setKeepOnScreenCondition
Позволяет управлять тем, как долго экран загрузки будет оставаться видимым, в зависимости от определенного условия.
class MainActivity: ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
splashScreen.setKeepOnScreenCondition { viewModel.splashLoading.value }
super.onCreate(savedInstanceState)
}
}
class MainViewModel: ViewModel() {
private val _splashLoading = MutableStateFlow(true)
val splashLoading: StateFlow<Boolean> get() = _splashLoading.asStateFlow()
}RenderThread
Отдельный поток для повышения производительности и плавности интерфейса. RenderThread отвечает за отрисовку UI, разгружая основной поток (UI Thread) и минимизируя задержки и лаги в отображении интерфейса.
• Появился в Android 5.0 (API 21).
Gestures
GestureDetector
Класс, который используется для распознавания простых жестов пользователя, таких как нажатие, двойное нажатие, смахивание и прокрутка. Этот класс помогает обработать сложные взаимодействия с пользователем на основе последовательности событий касания.
val gestureDetector = GestureDetector(context, object: GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent): Boolean {
// обработка одиночного нажатия
return true
}
override fun onLongPress(e: MotionEvent) {
// обработка долгого нажатия
}
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
// обработка смахивания
return true
}
})
override fun onTouchEvent(event: MotionEvent): Boolean {
return gestureDetector.onTouchEvent(event)
}GestureListener
Интерфейс, который используется для обработки жестов пользователя.
onDown
Вызывается при первом касании экрана.
onShowPress
Вызывается, когда палец касается экрана, но еще не отпущен.
onSingleTapUp
Вызывается при быстром одиночном нажатии.
onScroll
Вызывается при движении пальца по экрану.
onLongPress
Вызывается при долгом нажатии.
onFling
Вызывается при быстром движении пальца по экрану (смахивании).
Animations
ValueAnimator
Представляет механизм для запуска анимаций вычисления анимированных значений и установки их для целевых объектов.
ObjectAnimator
Наследуется от ValueAnimator. Обеспечивает поддержку анимации свойств целевых объектов. Анимации можно создавать из кода и XML.
ViewPropertyAnimator
Вызывается через View.animate. Подходит для выполнения нескольких анимаций одновременно.
HEX-Colors Opacity
| HEX | Opacity |
|---|---|
| 100% | FF |
| 99% | FC |
| 98% | FA |
| 97% | F7 |
| 96% | F5 |
| 95% | F2 |
| 94% | F0 |
| 93% | ED |
| 92% | EB |
| 91% | E8 |
| 90% | E6 |
| 89% | E3 |
| 88% | E0 |
| 87% | DE |
| 86% | DB |
| 85% | D9 |
| 84% | D6 |
| 83% | D4 |
| 82% | D1 |
| 81% | CF |
| 80% | CC |
| 79% | C9 |
| 78% | C7 |
| 77% | C4 |
| 76% | C2 |
| 75% | BF |
| 74% | BD |
| 73% | BA |
| 72% | B8 |
| 71% | B5 |
| 70% | B3 |
| 69% | B0 |
| 68% | AD |
| 67% | AB |
| 66% | A8 |
| 65% | A6 |
| 64% | A3 |
| 63% | A1 |
| 62% | 9E |
| 61% | 9C |
| 60% | 99 |
| 59% | 96 |
| 58% | 94 |
| 57% | 91 |
| 56% | 8F |
| 55% | 8C |
| 54% | 8A |
| 53% | 87 |
| 52% | 85 |
| 51% | 82 |
| 50% | 80 |
| 49% | 7D |
| 48% | 7A |
| 47% | 78 |
| 46% | 75 |
| 45% | 73 |
| 44% | 70 |
| 43% | 6E |
| 42% | 6B |
| 41% | 69 |
| 40% | 66 |
| 39% | 63 |
| 38% | 61 |
| 37% | 5E |
| 36% | 5C |
| 35% | 59 |
| 34% | 57 |
| 33% | 54 |
| 32% | 52 |
| 31% | 4F |
| 30% | 4D |
| 29% | 4A |
| 28% | 47 |
| 27% | 45 |
| 26% | 42 |
| 25% | 40 |
| 24% | 3D |
| 23% | 3B |
| 22% | 38 |
| 21% | 36 |
| 20% | 33 |
| 19% | 30 |
| 18% | 2E |
| 17% | 2B |
| 16% | 29 |
| 15% | 26 |
| 14% | 24 |
| 13% | 21 |
| 12% | 1F |
| 11% | 1C |
| 10% | 1A |
| 9% | 17 |
| 8% | 14 |
| 7% | 12 |
| 6% | 0F |
| 5% | 0D |
| 4% | 0A |
| 3% | 08 |
| 2% | 05 |
| 1% | 03 |
| 0% | 00 |
Server-Driven UI (SDUI)
Подход к разработке, в котором сервер управляет отображением пользовательского интерфейса (UI) на клиенте. Вместо жестко закодированного UI на стороне клиента, сервер отправляет инструкции или JSON-описание, и клиентский код строит интерфейс на их основе.
{
"type": "VerticalLayout",
"children": [
{
"type": "Text",
"text": "Добро пожаловать!"
},
{
"type": "Button",
"text": "Начать",
"action": "navigate_to_start"
}
]
}fun renderUI(json: String) {
val uiData = parseJson(json)
when (uiData.type) {
"Text" -> Text(text = uiData.text)
"Button" -> Button(onClick = { handleAction(uiData.action) }) {
Text(text = uiData.text)
}
"VerticalLayout" -> Column {
uiData.children.forEach { renderUI(it) }
}
}
}Вопросы на собесе (10)
XML (2)
- Для чего используется тег merge в XML?
Для повторного использования иерархий представлений, позволяя вставлять содержимое одного XML-файла в другой. Это упрощает управление разметкой и уменьшает дублирование кода.
- Для чего используется тег include в XML?
Для повторного использования разметки, позволяя вставлять содержимое одного XML-файла в другой. Это упрощает управление представлениями и уменьшает дублирование кода.
- Для чего используется тег merge в XML?
Другие (8)
- C какой частотой должен отрисовываться UI?
UI должен отрисовываться с частотой не менее 60 кадров в секунду (FPS) для обеспечения плавного и отзывчивого пользовательского интерфейса. Это соответствует обновлению экрана каждые 16,67 миллисекунд. Если частота падает ниже 30 FPS, пользователь может заметить задержки и подтормаживания, что ухудшает опыт использования приложения.
- Что такое RenderThread?
Это отдельный поток в Android, используемый для операций отрисовки пользовательского интерфейса, таких как анимации и графика. Он разгружает основной поток приложения, улучшая отзывчивость интерфейса и снижая задержки при отрисовке, что особенно важно в графически насыщенных приложениях.
- Какие есть инструменты для создания анимаций?
ValueAnimatorPropertyAnimatorObjectAnimatorMotionLayout
- Как в Android обрабатывать жесты?
•
GestureDetectorдля распознавания стандартных жестов, таких как одиночное нажатие, двойное нажатие, пролистывание и т.д. Можно переопределить методыonSingleTapConfirmed()иonFling()для обработки конкретных жестов.•
ScaleGestureDetectorдля обработки жестов масштабирования, позволяя обрабатывать увеличение и уменьшение масштаба.•
TouchListenerреализуйте интерфейсOnTouchListenerнаViewдля получения детальных данных о прикосновениях и отслеживания движений пальцев.
- Что нельзя делать с MotionEvent?
Сохранять ссылки на него. Поскольку события генерируются в большом количестве, а система использует ограниченный пул объектов, сохранять ссылки на
MotionEventнеправильно. Лучше обрабатывать события сразу, чтобы избежать проблем с производительностью и утечками памяти.
- Как оптимизировать UI?
• Не рисовать фон в XML. устанавливать его в
windowBackground.• Задавать размеры
Viewесли они известны чтобы не тратить ресурсы на измерение.
- Какой метод используется для получения ссылки на компонент из макета?
•
getViewByld()•
findViewByld()•
findComponentByld()•
getComponentByld()
- Какой из следующих классов используется для создания анимаций в Android?
•
AnimationManager•
AnimationController•
AnimationUtils•
AnimationHandler
- C какой частотой должен отрисовываться UI?