Яндекс выпускает DivKit — фреймворк для server-driven UI с открытым кодом
Яндекс выложил свой движок для динамического создания UI. Кому это будет полезно? Для начала - это каталоги чего-либо в приложении. В Яндексе движок используется Едой, Маркетом, Яндекс ТВ и др. продуктами.
Что включается в себя DivKit:
👉 SDK для Android, iOS и Web
👉 DSL для создания UI на сервере
Исходный код опубликован на Гитхабе под лицензией Apache 2.0, а это значит его можно использовать в коммерческих проектах
#ui
Яндекс выложил свой движок для динамического создания UI. Кому это будет полезно? Для начала - это каталоги чего-либо в приложении. В Яндексе движок используется Едой, Маркетом, Яндекс ТВ и др. продуктами.
Что включается в себя DivKit:
👉 SDK для Android, iOS и Web
👉 DSL для создания UI на сервере
Исходный код опубликован на Гитхабе под лицензией Apache 2.0, а это значит его можно использовать в коммерческих проектах
#ui
👍48👎22🤔1
Optimizing RecyclerView : Pre-inflated ViewPool (6 мин)
Ускорение RecyclerView через рендеринг элементов списка наперед в фоновом потоке
#performance #ui
Ускорение RecyclerView через рендеринг элементов списка наперед в фоновом потоке
#performance #ui
👍74👎12🤔5🔥1💯1
This media is not supported in your browser
VIEW IN TELEGRAM
Готовим Window Inset под соусом Jetpack Compose и щепоткой View
Я обожаю приложения, которые используют всю поверхность экрана от края до края. В статье разбирается как это сделать при использовании Compose
#ui #compose
Я обожаю приложения, которые используют всю поверхность экрана от края до края. В статье разбирается как это сделать при использовании Compose
#ui #compose
🔥65👎8👍6❤1
Всем выйти из сумрака: как добавить тень на Android
Разработчик дизайн системы просветит вас о тенях в Android:
👉 зачем нужны
👉 параметр elevation
👉 MaterialShapeDrawable
👉 Создание 9-patch Drawable в коде динамически
👉 системные тени против кастомных
#ui
Разработчик дизайн системы просветит вас о тенях в Android:
👉 зачем нужны
👉 параметр elevation
👉 MaterialShapeDrawable
👉 Создание 9-patch Drawable в коде динамически
👉 системные тени против кастомных
#ui
👍33🤔3⚡1😁1
Лучшие практики и что НЕ стоит делать при оптимизации вашего приложения для больших экранов
👉 Несколько приложения могут работать одновременно и запрашивать доступ к одним и тем же ресурсам, например камерам
👉 Аксессуары могут быть подключены по USB и отключены в любой момент
👉 Приложение в onPause() всё еще видно до вызова onStop()
👉 Не полагайтесь на флаги из ресурсов "isTable". Отталкивайтесь от размеров экранов в dp
👉 Используйте CameraX по возможности
👉 Соотношение сторон окна приложения может меняться в любой момент
👉 Правильно указывайте требования к железу устройства в AndroidManifest корректно: что обязательно, опционально и вовсе неважно
👉 Window Insets не меняются на больших экранах
👉 Не полагайтесь на сенсорный экран. Устройство может его не иметь
#ui #tablet #foldable #chromeos
👉 Несколько приложения могут работать одновременно и запрашивать доступ к одним и тем же ресурсам, например камерам
👉 Аксессуары могут быть подключены по USB и отключены в любой момент
👉 Приложение в onPause() всё еще видно до вызова onStop()
👉 Не полагайтесь на флаги из ресурсов "isTable". Отталкивайтесь от размеров экранов в dp
👉 Используйте CameraX по возможности
👉 Соотношение сторон окна приложения может меняться в любой момент
👉 Правильно указывайте требования к железу устройства в AndroidManifest корректно: что обязательно, опционально и вовсе неважно
👉 Window Insets не меняются на больших экранах
👉 Не полагайтесь на сенсорный экран. Устройство может его не иметь
#ui #tablet #foldable #chromeos
👍17👎8🤔4🤯4
This media is not supported in your browser
VIEW IN TELEGRAM
Layout Inspector теперь встроен в раздел "Running Devices". Заявляют что до 2 раз быстрее стал работать
#androidstudio #инструменты #ui
#androidstudio #инструменты #ui
👍44🔥5
Forwarded from Compose Broadcast
Разбор (EN, 7м) сложностей тестирования UI на Compose со стандартным решением от Google.
Сделал автор библиотеки для тестирования Ultron и показывает как можно делать их удобнее
#автотесты #ui #compose #ultron #тестирование
Сделал автор библиотеки для тестирования Ultron и показывает как можно делать их удобнее
#автотесты #ui #compose #ultron #тестирование
👍4
Объект Configuration, который приходит разработчикам в параметрах размеров не включает размеры системных панелей. Из-за форсирования Edge-to-Edge в Android 15 вносятся изменения в Configuration:
👉 Configuration.screenWidthDp и screenHeightDp теперь будут включать размер системных панелей
👉 Configuration.smallestScreenWidthDp задевается из-за изменения размеров Configuration.screenWidthDp и screenHeightDp
👉 Configuration.orientation также будет вести отлично на квадратных и близких к ним дисплеях
#android15 #ui
👉 Configuration.screenWidthDp и screenHeightDp теперь будут включать размер системных панелей
👉 Configuration.smallestScreenWidthDp задевается из-за изменения размеров Configuration.screenWidthDp и screenHeightDp
👉 Configuration.orientation также будет вести отлично на квадратных и близких к ним дисплеях
#android15 #ui
👍3
Одно из официальных приложений-примеров Compose в Android - Jetcaster, обновили и добавили поддержку складных смартфонов, Chrome OS, больших экранов, Android TV и часов на WearOS. Также появились App Widget на Compose с помощью либы Glance
Подробно об процессе поддержки и шаринга кода между платформами читайте в статье (EN, 12м)
#compose #android #androidtv #wearos #foldable #ui #chromeos
Подробно об процессе поддержки и шаринга кода между платформами читайте в статье (EN, 12м)
#compose #android #androidtv #wearos #foldable #ui #chromeos
👍34🔥4❤2
Google Выложила руководство по адаптации Android приложения для работы с оконном режиме как в Desktop, который есть на Chrome и уже тестируется в Google Pixel Tablet, но и без него уже производители делали этот функционал
#adaptive #планшет #ui
#adaptive #планшет #ui
👍21 10❤6🔥3
🚀 Вышел Jetpack WindowManager 1.4 - библиотека с API для построения адаптивного UI в Material3 (можно применить и к другим UI Kit): WindowSizeClass, Activity embedding, WindowsInfoTracker и др.
Про изменения отдельными постами дальше
#jetpack #ui #material
Про изменения отдельными постами дальше
#jetpack #ui #material
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👎3
Сделали рефакторинг API, чтобы оно позволило добавлять собственные значения в будущем (помимо NORMAL, LARGE, EXPANDED), а также отказались от WindowWidthSizeClass и WindowHeightSizeClass.
// Было. Теперь deprecated
val sizeClass = WindowSizeClass.compute(widthDp, heightDp)
when (sizeClass.widthSizeClass) {
COMPACT -> doCompact()
MEDIUM -> doMedium()
EXPANDED -> doExpanded()
else -> doDefault()
}
// Стало в 1.4
val sizeClass = WindowSizeClass.BREAKPOINTS_V1
.computeWindowSizeClass(widthDp, heightDp)
// Проверяем от самого большого размера к наименьшему
when {
sizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND) -> {
doExpanded()
}
sizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_MEDIUM_LOWER_BOUND) -> {
doMedium()
}
else -> {
// Ветка по умолчанию должна быть для
// самого маленького поддерживаемого UI
doCompact()
}
}
#jetpack #material #adaptive #ui
Please open Telegram to view this post
VIEW IN TELEGRAM
👎10👍8😢2
👉 Изменение размера панелей теперь поддерживается из коробки
val splitAttributesBuilder: SplitAttributes.Builder = SplitAttributes.Builder()
.setSplitType(SplitAttributes.SplitType.ratio(0.33f))
.setLayoutDirection(SplitAttributes.LayoutDirection.LEFT_TO_RIGHT)
if (WindowSdkExtensions.getInstance().extensionVersion >= 6) {
splitAttributesBuilder.setDividerAttributes(
DividerAttributes.DraggableDividerAttributes.Builder()
.setColor(getColor(context, R.color.divider_color))
.setWidthDp(4)
.setDragRange(
DividerAttributes.DragRange.DRAG_RANGE_SYSTEM_DEFAULT)
.build()
)
}
val splitAttributes: SplitAttributes = splitAttributesBuilder.build()
👉 Управление затемнением интерфейса под диалогом диалога
👉 Возможность закрепить Activity Task (набор Activity) по id в части экрана
fun pinActivityStackExample(taskId: Int) {
val splitAttributes: SplitAttributes = SplitAttributes.Builder()
.setSplitType(SplitAttributes.SplitType.ratio(0.66f))
.setLayoutDirection(SplitAttributes.LayoutDirection.LEFT_TO_RIGHT)
.build()
val pinSplitRule = SplitPinRule.Builder()
.setDefaultSplitAttributes(splitAttributes)
.build()
SplitController.getInstance(applicationContext)
.pinTopActivityStack(taskId, pinSplitRule)
}
#jetpack #ui #material #activity
Please open Telegram to view this post
VIEW IN TELEGRAM
👎7👍6
This media is not supported in your browser
VIEW IN TELEGRAM
В рамках The Android Show I/O Edition показали "самый большой редизайн Android за всё время" (со слов спикера). Нас ждет Material 3 Expressive - обновленная версия Material 3 на основе существующих токенов
Буду садиться разбираться и рассказывать на
#android #android16 #material #ui #material3expressive
Please open Telegram to view this post
VIEW IN TELEGRAM
❤33👍17🔥11🤔1🤯1
🤯 Navigation Drawer становится Deprecated
В Material 3 Expressive делают deprecated компонент "Navigation Drawer". Заменой ему предлагают "Navigation Rail", предлагающий ту же функциональность, но лучше адаптирующийся под разные размеры окна
#ui #material #material3 #material3expressive
В Material 3 Expressive делают deprecated компонент "Navigation Drawer". Заменой ему предлагают "Navigation Rail", предлагающий ту же функциональность, но лучше адаптирующийся под разные размеры окна
#ui #material #material3 #material3expressive
🤯64🔥28👍16🤔11
👍37🔥8🤔8
This media is not supported in your browser
VIEW IN TELEGRAM
Google активно продвигает поддержку больших экранов и теперь тестировать UI на Compose в Android Studio будет проще. Изменять размер окна превью можно прямо в IDE и интерфейс будет подстраиваться под текущий размер.
Попробовать можно в свежей версии Android Studio Narhwall Feature Drop или новее. В Compose Preview надо переключить на режим "Focus"
#androidstudio #compose #ui
Please open Telegram to view this post
VIEW IN TELEGRAM
👍57🔥30
Material Design 3 Expressive красив только на картинках от дизайнеров. По сути своей сделали гигантизм, из-за чего приходится на маленьких экранах уводить в более мелкие элементы интерфейса (через настройки плотности). Переводы и размещение текста оставляют желать лучшего. Как по мне - худший редизайн Android за всю историю.
Успели попробовать? Какие ваши впечатления?
#material #ui
Успели попробовать? Какие ваши впечатления?
#material #ui
🤯73👍45🤝8❤2
🚀 Отказываюсь от Списков в пользу Сеток в UI
Раньше для списков в Compose я по привычке использовал LazyColumn. Но чем больше работаю с адаптивными интерфейсами, тем очевиднее: это никуда не годиться и надо использовать доступное пространство, а не тупо растягивать интерфейс. Перехожу на Grid компоновку✔️
LazyVerticalGrid позволяет задать фиксированную ширину колонки, и система сама рассчитает, сколько их поместится на экране.
В результате:
1️⃣ адаптивность «из коробки» на телефонах, планшетах и больших экранах
2️⃣ минимум дополнительного кода,
3️⃣ единый компонент вместо костылей для разных форм-факторов.
Определение количества колонок происходит на основе политики GridCell:
📱 На маленьком экране это будет 2–3 колонки, а на планшете — уже 5–6, и всё это без ручной логики.
Есть еще более гибкий вариант если элементы строк должны быть разной высоты - LazyVerticalStaggeredGrid (стиль как в Pinterest)
❗️ Теперь я придерживаюсь строго правила:
🔗 Очень хорошо построение списков осветили в документации по Lazy Layout
Аналогично можно проделать и с RecyclerView, использую вместо LinearLayoutManager вариант с сеткой - GridLayoutManager или StaggeredGridLayoutManager, только там не будет автоматического расчета колонок на основе доступного места. Это придется реализовывать самостоятельно.
✍️ Что думаете о таком подходе для UI? Ударит по производительности?
#ui #android #compose
Раньше для списков в Compose я по привычке использовал LazyColumn. Но чем больше работаю с адаптивными интерфейсами, тем очевиднее: это никуда не годиться и надо использовать доступное пространство, а не тупо растягивать интерфейс. Перехожу на Grid компоновку
LazyVerticalGrid позволяет задать фиксированную ширину колонки, и система сама рассчитает, сколько их поместится на экране.
В результате:
LazyVerticalGrid(
columns = GridCells.Adaptive(minSize = 120.dp),
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(8.dp)
) {
items(100) { Item(...) }
}
Определение количества колонок происходит на основе политики GridCell:
// всегда N колонок
GridCells.Fixed(N)
// автоматический расчет на основе минимальной ширины колонки
GridCells.Adaptive(minSize = 120.dp)
// каждая ячейка шириной 100dp
GridCells.FixedSize(100.dp)
📱 На маленьком экране это будет 2–3 колонки, а на планшете — уже 5–6, и всё это без ручной логики.
Есть еще более гибкий вариант если элементы строк должны быть разной высоты - LazyVerticalStaggeredGrid (стиль как в Pinterest)
LazyVerticalStaggeredGrid(
columns = Adaptive(minSize = 150.dp),
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(8.dp)
) {
items(100) { Item(...) }
}
Если не могу явно сформулировать почему интерфейс должен быть в одну колонку, то вертикальный список брать не стоит!
🔗 Очень хорошо построение списков осветили в документации по Lazy Layout
Аналогично можно проделать и с RecyclerView, использую вместо LinearLayoutManager вариант с сеткой - GridLayoutManager или StaggeredGridLayoutManager, только там не будет автоматического расчета колонок на основе доступного места. Это придется реализовывать самостоятельно.
#ui #android #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍88🤔16🏆9🔥8❤1🙏1