Как стать автором
Обновить

Комментарии 18

Все же желательно анимаций добавлять, на картинке не понятно ничего. Можно даже из студии записать или с телефона только нужную composable.

Привет! Спасибо за комментарий, добавил анимацию.

Я тут вчитался в код и могу сказать одно - такое большое создание bitmaps явно не есть хорошо... С учётом того, что они никак с cache не связаны.

Согласен, на отрисовку тратятся большие ресурсы из-за постоянного создания Bitmaps. Но на скорости работы это не сказывается, даже на относительно старых устройствах (тестировал на API 24) из-за выноса в фоновый поток. Что касается кэширования - занимало бы много памяти, эффект все-таки не такой значительный) Вообще была цель сделать динамический блюр без использования сторонних библиотек. Если у Вас есть идеи, как можно оптимизировать мое решение, буду очень благодарен совету!

На 12 Андроиде blur из коробки есть, хотя бы там можно просто modifier добавлять, без создания bitmaps. Ниже вообще вопрос насколько оно нужно.

Вы немного не поняли постановку задачи - нужен динамический блюр, его нет ни на Android 12, ни на остальных версиях.

Можно узнать что вы понимаете под динамическим блюром и чем вы предполагаете его делают?

Посмотрите modifier blur, это точно не то что вам нужно?

Блюр, о котором Вы говорите, не умеет умеет размывать фон, поэтому пришлось бы делать все то же самое. Только это решение работало бы только с Android 12, а подход, описанный в статье, работает и на более ранних версиях.

Под динамическим блюром я понимаю кейс, при котором фон меняется, то есть область, которую надо размыть, динамична.

НЛО прилетело и опубликовало эту надпись здесь

Ну так стати в critical native/fast native изменения и правда можно попробовать вынести (не факт что поможет), правда считать придется или самому (без bitmap factory) или библиотеками C/C++, задача интересная, я бы таким позанимался б.

А какие критерии "современности" UI вы используете? Как отличаете "современный" от "фу, экскременты мамонта"?

Добрый день, спасибо за комментарий! В первую очередь это сами эффекты - параллакс, динамический блюр (не видел такого на compose под Android), p2r с отрицательным скроллом и сопротивлением (как на IOS), навбар, интегрированный в элемент на карточке. Даешь больше плавности и анимаций! Также, для реализации некоторых эффектов использовались экспериментальные, на данный момент, Api. А у Вас какие критерии свежести UI?

Во вью это все как бэ тоже работает, over scroll называется. Блюр тоже можно сделать (в самом крайнем случае surface view всех спасет)

Сам компоуз конечно хорош, спору нет, но и стандартный инструментарий возможностей даёт не мало.

А то у compose транзишинов так и нет, анимаций у row/column тоже, анимации у lazy списков ну такое себе...

Вы не правы, транзишны уже почти готовы и их поддержка добавлена с версии 1.5 (около того)
Анимаций у Row/Column тоже
Анимации у lazy списков пофиксили довольно давно.

К слову в статье много ошибок в реализации, начиная от вычисления анимаций на каждый кадр и заканчивая кропом битмапа на каждый кадр... Блюр как сказали выше тоже неверно реализован.

Я может чего не понимаю, но анимаций по документации у обычных списков нет

https://developer.android.com/jetpack/compose/lists

Анимации у lazy есть, но они выглядят гораздо хуже чем анимации rv.

Поддержка транзишенов заявлена и разрабатывается, но пока ее нет. И когда будет не ясно.

По поводу статьи - автор привел рабочее решение, можно с ним не соглашаться, но он молодец все же.

Здравствуйте, спасибо за комментарий! Можете подсветить, в каких местах, как Вы считаете, были допущены ошибки, для конструктивной дискуссии?

Вырезать бесполезные derivedStateOf которые не уменьшают количество вычислений и заменить их нормальными, вы (если вы писали код) пока не понимаете зачем нужны derivedState и как их использовать, рекомендую почитать доки, сделать анимации через animate*AsState а не вручную считать на каждый кадр, битмапы можно кропать через modifier.clip/size, а не пересоздавать. Блюр для иконок делать можно и правда через modifier.blur используя второй размытый слой битмапа с маской или написать шейдер. Не использовать низкоуровневые api типа canvas, сделать можно проще через композицию

И я не верю что ваше решение не лагает. Даже на гифке лагает. А самое важное это не лаги а потребление батареи и памяти

Зарегистрируйтесь на Хабре, чтобы оставить комментарий