#окр@clockstackwheels
Это проект потребовал несколько месяцев проб и ошибок, но я очень доволен тем, как вышло.
Сначала для организации ящиков хотел взять популярную систему Gridfinity. Это набор спецификаций и генераторов моделей для 3D-печати, предлагающий укладывать на любую плоскость сетку с ячейками 42мм и ставить в неё коробочки, кратные по размерам шагу сетки. Система продумана очень хорошо, потому что коробочки лёгкие, прочные, укладываются в любых комбинациях и штабелируются. А ещё она опенсорсная, и комьюнити круто её развило. Меня смущал только один момент: ряд предметов не требуют вытаскиваемую коробочку. Да, охапку шурупов удобно сложить в такую и доставать целиком. Но, скажем, если у вас в ящике лежит тюбик клея, зачем вам вытаскивать всю конструкцию, в которой он размещается? Вы просто берёте тюбик. Я подумал, что, возможно, смогу придумать систему, в которой коробочки держатся друг за друга, и только иногда их можно сделать вытаскиваемыми, когда такое требуется.
Дальше были десятки дней экспериментов и прототипов. Коробочки с крючками, с защёлками, волнистыми стенками, защёлки на дне, защёлки на боку... Всё это оказывалось хуже, чем Gridfinity: тратило больше пластика и времени печати, а основную цель во многих ситуациях не закрывало.
Тогда я понял, что подходил к задаче вообще не с того угла. Не нужно стараться заменить Gridfinity, она слишком хороша, слишком здорово продумана. Нужно дополнить её, сделать для неё расширение, которое будет добавлять фиксированные секции. И тогда я заменил дно-сетку на платформу с пазами типа «ласточкин хвост». Она спроектирована с той же ячейкой 42мм, можно составить плоскость любого размера, печатая из частей, а в пазы вставляются либо стенки-перегородки, либо посадочные упоры для Gridfinity-коробочек.
В дополнение быстро пришёл к решению, что у стенок можно минимизировать расход пластика, не потеряв прочность, если применить гексагональную сетку. Не просто так пчёлы делают свои соты такой формы.
Как и любая верная инженерная идея, эта сразу оказалась гармоничной и автоматически решила ряд других проблем:
1. Расход пластика там, где не нужно вытаскивать секции, в разы меньше, чем если делать секции коробочками. А создавать сетчатые стенки можно быстро и беспроблемно, потому что печатаются они плашмя, в отличие от стенок стандартных коробочек, которые неизбежно печатаются вертикально.
2. Можно делать секции не прямоугольной формы. И секции такого размера, который превышает область печати принтера.
3. Печатаются одинаковые стенки-перегородки, и из них собирается нужная схема уже под каждый конкретный ящик. Не нужно сначала прикидывать размеры требуемых коробочек.
4. Но в любую секцию ставится стандартная Gridfinity-коробочка заменой целых стенок на половинные и установкой упоров.
5. Стенки или упоры под коробочки автоматически являются и способом соединения участков дна между собой.
Сделал так уже два ящика, и пока во всех вариантах получается удобно. Подшлифую, оформлю и выложу все файлы в опенсорс (главным образом это генератор в формате OpenSCAD).
#diy@clockstackwheels
HotSwan - быстрое обновление Composable на реальном устройстве. Доступно как плагин для Android Studio
Я выбрал другой путь - делаю СMP проект с поддержкой Android + Desktop JVM и так можно быстро проверять + делать код чище.
#Compose
⚙️ Нашел сайт с демонстрацией того как происходит рекомпозиция с примером хороших и плохих практик
Как была сделана реализация написали в статье, а исходники есть на GitHub
#compose
⚙️ Нужно ли проставлять аннотации @Stable и @Immutable сразу при написании кода? 🤔 Мой ответ — НЕТ!
Не стоит заниматься преждевременной оптимизацией. Пишите UI без оглядки на аннотации стабильности, а затем используйте инструменты анализа, чтобы определить, где действительно возникают лишние рекомпозиции и есть смысл оптимизировать типы.
Как анализировать рекомпозиции и пропуски?
👉 Используйте Layout Inspector в Android Studio (подробнее — в этом посте)
👉 Включайте отслеживание работы composable-функций в System Trace
👉 Можно воспользоваться библиотекой Compose Investigator, чтобы получать детальные логи по рекомпозициям
‼️Важный нюанс:
Если вы используете типы из внешних библиотек или из модулей, где не подключён Compose Compiler, такие типы всегда считаются Unstable. Это может приводить к лишним рекомпозициям.
🚀Strong Skipping Mode действительно упростил жизнь разработчикам, но старайтесь передавать в параметры Сomposable-функций только Stable или Immutable типы. Это позволит максимально эффективно использовать skipping и сделать UI более производительным.
#compose
Вышел Coil 3.2.0
Что нового
⬆️ Обновление Kotlin, Compose, Okio, Skiko, Coroutines и др зависимостей до актуальных версий
🛠 Исправление багов
👉 Compose артефакты требуют Java 11 и выше из-за перехода на Compose 1.8.0
#compose
⚙️Вышел Jetpack Compose 1.10.0
👉 Стабильное API Shared Transition
👉 Оптимизированный скролл
👉 Новые подходы к сохранению данных при пересоздании Activity через ViewModel
🚀 Повышена производительность UI на Compose
🛠 Исправлено багов и шероховатостей
Изменений действительно много — в один пост всё не поместить.
Буду разбирать ключевые обновления по отдельности в следующих публикациях на @compose_broadcast✨
#compose#android
🤖 Как использовать Compose, чтобы сделать анимированный Splash Screen
Разработчик создал библиотеку androidx-splashscreen-compose (не от Google решение), которая позволяет делать красивую анимацию как на анимашке.
Подробный разбор и реализация есть в статье (EN,6м, альт. ссылка) или 🐱исходниках на GitHub
#android#compose
⚙️Вышел Jetpack Compose 1.9 Stable (августа 2025)
Главные новинки:
👉 Тени нового поколения — dropShadow() и innerShadow() дают больше контроля, чем классический shadow().
👉 LazyLayout — новый API предзагрузки и кэширования элементов для более плавного скролла.
👉 2D-прокрутка — Scrollable2D для таблиц, карт и больших изображений.
👉 Расширенный stack trace — имена composable и их позиции для отладки в stacktrace (только в debug).
👉 Новые аннотации — @RememberInComposition, @FrequentlyChangingValue и перенос @Stable в отдельный модуль.
Подробнее буду рассказывать в @compose_broadcast. Подписывайтесь!
#compose#android
📹Mastering text input in Compose (EN, 18м)
Google выпустили шикарное видео, где показали лучшие практики работы с текстовыми полями в Compose — с примерами, API и лайфхаками.
В ролике разработчики на примере рассказывают:
👉 как использовать state-based TextField — новый подход к управлению вводом;
👉 зачем нужен SecureTextField и как задать требования к паролю;
👉 как работает Autofill API (да, теперь можно сохранять логины и OTP);
👉 как кастомизировать поле ввода OTP с помощью BasicTextField и decorator;
👉 как принимать GIF и изображения через drag & drop с новым contentReceiver;
👉 как использовать input/output трансформации для автоподстановки скобок и тире в номерах;
#android#compose
⚙️ Вышел Jetpack Compose 1.8.0
Все новинки расскажу отдельными постами в @compose_broadcast, а именно:
👉 Autofill
👉 ресайзинг текста под контейне
👉 новое API для отслеживания Composable на экране
👉 анминирование границ Composable
👉 стабилизация API (убрали экспериментальные аннотации)
👉 ContextualFlowRow и ContextualFlowColumn теперь deprecated, им на замену используйте FlowRow и FlowColumn
👉 диалоги теперь учитывают режим экрана edge-to-edge
👉 упростили тестирование ClickableText
👉 появилась возможность кастомизации overscroll
Свежий BOM для новых версий
implementation(platform("androidx.compose:compose-bom:2025.04.01"))
#compose#android
⚙️Как работать с Custom Layout в Jetpack Compose (21м)
В этой статье вы найдете:
👉 как работают layout-ы в Compose;
👉 изменение layout-а отдельного компонента;
👉 создание кастомных Layout и LazyLayout;
👉 отложенную композицию.
Всё это на примерах, в том числе из дизайн-системы Авито.
#compose#android