Читаем Разработка Android приложении с Jetpack Compose полностью

Чтение состояния внутри кода отрисовки влияет на этап Drawing. Распространенные примеры включают: Canvas, Modifier.drawBehind и Modifier.drawWithContent. Когда значение считанного на этом этапе состояния меняется, Compose UI запускает только этап Drawing.



Оптимизация считывания состояния. Поскольку Compose выполняет отслеживание считывания состояний внутри этапов, мы можем минимизировать количество работы, выполняемой считыванием каждого состояния на этапах.



Посмотрим на пример ниже. У нас есть Image, который использует offset-модификатор для смещения своего положения. В результате во время скроллинга пользователь наблюдает эффект параллакса за счет добавления offset. Этот код работает, но дает неоптимальную производительность.



По мере прокрутки пользователем значение firstVisibleItemScrollOffset будет меняться. Как мы знаем, Compose отслеживает любое чтение состояния, чтобы можно было повторно вызвать считывающий этот состояние код, в нашем случае – содержимое Box.

В этом примере состояние читается внутри этапа Composition. Это необязательно плохо. Фактически – это основа рекомпозиции, позволяющая при изменении данных создавать новый UI. Причина не оптимальности кода в примере выше в том, что каждое событие скролла приводит к переоценке всего существующего composable-содержимого, и затем новому измерению, расположению и финальной отрисовке.

Мы запускаем этап Composition на каждую прокрутку, даже если то, что мы показываем, не изменилось, а изменилось только где показываем. Мы можем оптимизировать считывание нашего состояния, чтобы повторно запускать этапы, начиная с Layout.

Существует другая версия offset-модификатора. Эта версия функции принимает лямбду, которая возвращает итоговый offset.

Почему этот способ более производительный? Лямбда, которую мы предоставляем модификатору, вызывается во время этапа Layout – если быть точнее, во время шага размещения – что означает, что наше состояние firstVisibleItemScrollOffset больше не считывается во время этапа Composition. Compose отслеживает, когда состояние считано. Поэтому, если значение firstVisibleItemScrollOffset меняется, Compose должен только перезапустить этапы Layout и Drawing.

Вы можете спросить: не может ли использование лямбды привести к дополнительным затратам по сравнению с использованием простого значения? Так и есть. Однако выигрыш от чтения состояния на этапе Layout перевешивает эти затраты. Значение firstVisibleItemScrollOffset меняет каждый кадр в течение прокрутки, и, отложив чтение состояния до этапа Layout, мы совсем избегаем повторных этапов Composition.

Layouts

Основными layout в Jetpack Compose являются Box, Row, Column. Также Compose позволяет использовать аналоги Constraint Layout. Все эти компоненты inline Composable – функции. Это значит, что другие Composable функции могут быть вызваны внутри них.



Layouts могут быть представлены в коде как лямбда-блок, принимающий дополнительные параметры для изменения внешнего вида или поведения компонентов – позиционирование элементов, которые находятся внутри.

Box

Box – аналог FrameLayout в XML. Нижний элемент будет отображаться поверх остальных, первый выполняет функцию подложки/фона.



View без обернутого в Box имеет схожее поведение. За единственным исключением: вы не сможете контролировать расположение элементов на экране.

Box принимает 4 параметра:

modifier – позволяет настроить внешний вид и его поведение;

contentAlignment – устанавливает расположение элемента на экране, по умолчанию имеет значение Alignment.TopStart (расположение вначале контейнера в верхнем углу);

propagateMinConstraints – указывает, надо ли применять к содержимому ограничения минимального размера во время отрисовки, по умолчанию false;

content – объект интерфейса BoxScope, который подставляет вложенное содержимое, может быть заменен на лямбда-блок.

Column

Column layout – вертикальный список, LinearLayout в XML



Column принимает 4 параметра:

modifier – позволяет настроить внешний вид и его поведение;

verticalArrangment – выравнивание элементов по вертикали, по умолчанию имеет значение Arrangment.Top;

horizontalAlignment – выравнивание по горизонтали, по умолчанию имеет значение Alignment.Start;

content – объект интерфейса ColumnScope, который подставляет вложенное содержимое, может быть заменен на лямбда-блок;

Перейти на страницу:

Похожие книги

Павел I
Павел I

Библиотека проекта «История Российского государства» – это рекомендованные Борисом Акуниным лучшие памятники исторической литературы, в которых отражена биография нашей страны от самых ее истоков.Павел I, самый неоднозначный российский самодержец, фигура оклеветанная и трагическая, взошел на трон только в 42 года и царствовал всего пять лет. Его правление, бурное и яркое, стало важной вехой истории России. Магистр Мальтийского ордена, поклонник прусского императора Фридриха, он трагически погиб в результате заговора, в котором был замешан его сын. Одни называли Павла I тираном, самодуром и «увенчанным злодеем», другие же отмечали его обостренное чувство справедливости и величали «единственным романтиком на троне» и «русским Гамлетом». Каким же на самом деле был самый непредсказуемый российский император?

Казимир Феликсович Валишевский

История / Учебная и научная литература / Образование и наука
За степным фронтиром. История российско-китайской границы
За степным фронтиром. История российско-китайской границы

Российско-китайская граница – одна из самых протяженных сухопутных границ в мире, однако в современной историографии ей уделяется незаслуженно мало внимания. Пытаясь восполнить этот пробел, Сёрен Урбански в своей книге рассматривает формирование и изменение контуров границы в длительной хронологической перспективе, начиная с XVII столетия – времени существования фронтирной территории без четко установленного размежевания – и заканчивая XX веком, когда линия границы обрела геополитическое значение и превратилась в плотно патрулируемый барьер. Повествуя о повседневной жизни общин на российско-китайском пограничье, автор демонстрирует, как государствам удалось навязать контроль над родственными, культурными, экономическими и религиозными связями по обе стороны границы посредством законодательных мер, депортаций, принудительной ассимиляции и пропаганды. Сёрен Урбански – историк, научный сотрудник Германского исторического института в Вашингтоне и директор его филиала в Калифорнийском университете в Беркли.

Сёрен Урбански

История / Учебная и научная литература / Образование и наука
Поэзия как волшебство
Поэзия как волшебство

Трактат К. Д. Бальмонта «Поэзия как волшебство» (1915) – первая в русской литературе авторская поэтика: попытка описать поэтическое слово как конструирующее реальность, переопределив эстетику как науку о всеобщей чувствительности живого. Некоторые из положений трактата, такие как значение отдельных звуков, магические сюжеты в основе разных поэтических жанров, общечеловеческие истоки лиризма, нашли продолжение в других авторских поэтиках. Работа Бальмонта, отличающаяся торжественным и образным изложением, публикуется с подробнейшим комментарием. В приложении приводится работа К. Д. Бальмонта о музыкальных экспериментах Скрябина, развивающая основную мысль поэта о связи звука, поэзии и устройства мироздания.

Александр Викторович Марков , Константин Дмитриевич Бальмонт

Языкознание, иностранные языки / Учебная и научная литература / Образование и наука
Эстетика
Эстетика

В данный сборник вошли самые яркие эстетические произведения Вольтера (Франсуа-Мари Аруэ, 1694–1778), сделавшие эпоху в европейской мысли и европейском искусстве. Радикализм критики Вольтера, остроумие и изощренность аргументации, обобщение понятий о вкусе и индивидуальном таланте делают эти произведения понятными современному читателю, пытающемуся разобраться в текущих художественных процессах. Благодаря своей общительности Вольтер стал первым художественным критиком современного типа, вскрывающим внутренние недочеты отдельных произведений и их действительное влияние на публику, а не просто оценивающим отвлеченные достоинства или недостатки. Чтение выступлений Вольтера поможет достичь в критике основательности, а в восприятии искусства – компанейской легкости.

Виктор Васильевич Бычков , Виктор Николаевич Кульбижеков , Вольтер , Теодор Липпс , Франсуа-Мари Аруэ Вольтер

Детская образовательная литература / Зарубежная классическая проза / Прочее / Зарубежная классика / Учебная и научная литература