Android Broadcast
14.2K subscribers
3.53K photos
343 videos
11 files
5.91K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab
加入频道
Яндекс выпускает DivKit — фреймворк для server-driven 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
👍74👎12🤔5🔥1💯1
This media is not supported in your browser
VIEW IN TELEGRAM
Готовим Window Inset под соусом Jetpack Compose и щепоткой View

Я обожаю приложения, которые используют всю поверхность экрана от края до края. В статье разбирается как это сделать при использовании Compose

#ui #compose
🔥65👎8👍61
Всем выйти из сумрака: как добавить тень на Android

Разработчик дизайн системы просветит вас о тенях в Android:
👉 зачем нужны
👉 параметр elevation
👉 MaterialShapeDrawable
👉 Создание 9-patch Drawable в коде динамически
👉 системные тени против кастомных

#ui
👍33🤔31😁1
Статья с разносом того что все плюсы, которые несет темная тема в приложении несущественны, а ее поддержка несет много дополнительной работы при разработке, хотя можно вложиться в фичи.

Вывод - делайте только светлую тему, либо темную. Но решать вам!

#ui
👎165👍22🌚11🤔7🥱5🤣4🤬1
Лучшие практики и что НЕ стоит делать при оптимизации вашего приложения для больших экранов

👉 Несколько приложения могут работать одновременно и запрашивать доступ к одним и тем же ресурсам, например камерам
👉 Аксессуары могут быть подключены по 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
👍44🔥5
Forwarded from Compose Broadcast
Разбор (EN, 7м) сложностей тестирования UI на Compose со стандартным решением от Google.

Сделал автор библиотеки для тестирования Ultron и показывает как можно делать их удобнее

#автотесты #ui #compose #ultron #тестирование
👍4
Объект Configuration, который приходит разработчикам в параметрах размеров не включает размеры системных панелей. Из-за форсирования Edge-to-Edge в Android 15 вносятся изменения в Configuration:
👉 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
👍34🔥42
Google Выложила руководство по адаптации Android приложения для работы с оконном режиме как в Desktop, который есть на Chrome и уже тестируется в Google Pixel Tablet, но и без него уже производители делали этот функционал

#adaptive #планшет #ui
👍21106🔥3
🚀 Вышел Jetpack WindowManager 1.4 - библиотека с API для построения адаптивного UI в Material3 (можно применить и к другим UI Kit): WindowSizeClass, Activity embedding, WindowsInfoTracker и др.

Про изменения отдельными постами дальше

#jetpack #ui #material
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👎3
🚀 Изменения в WindowSizeClass

Сделали рефакторинг 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
🚀 Обновления Activity Embedding

👉 Изменение размера панелей теперь поддерживается из коробки
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
🤖 Редизайн Android - Material 3 Expressive

В рамках The Android Show I/O Edition показали "самый большой редизайн Android за всё время" (со слов спикера). Нас ждет Material 3 Expressive - обновленная версия Material 3 на основе существующих токенов

Буду садиться разбираться и рассказывать на 🪙 Boosty про что будет в обновлении

#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
🤯64🔥28👍16🤔11
Можно ли использовать ChatGPT для создания дизайна пользовательского интерфейса? Да!

Разработчик подробно рассказал как с помощью ChatGPT делал дизайн проекта, какие запросы писал и важные аспекты!

Подробности тут (перевод на русский), оригинал тут

#ai #ui #chatgpt
👍37🔥8🤔8
This media is not supported in your browser
VIEW IN TELEGRAM
🔨 Превью Compose можно будет изменять прямо в IDE

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
🤯73👍45🤝82
🚀 Отказываюсь от Списков в пользу Сеток в UI

Раньше для списков в Compose я по привычке использовал LazyColumn. Но чем больше работаю с адаптивными интерфейсами, тем очевиднее: это никуда не годиться и надо использовать доступное пространство, а не тупо растягивать интерфейс. Перехожу на Grid компоновку ✔️

LazyVerticalGrid позволяет задать фиксированную ширину колонки, и система сама рассчитает, сколько их поместится на экране.
В результате:
1️⃣ адаптивность «из коробки» на телефонах, планшетах и больших экранах
2️⃣ минимум дополнительного кода,
3️⃣единый компонент вместо костылей для разных форм-факторов.

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? Ударит по производительности?

#ui #android #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍88🤔16🏆9🔥81🙏1