Connect with us

Разработка

Рисуем график сна в Compose

В этой статье приведено руководство по созданию собственного графика сна, подобного тому, который можно найти в приложении Fitbit.

Опубликовано

/

     
     

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

Как рисовать в Compose?

Чтобы начать рисовать в Compose, мы можем использовать модификаторы рисования или композабл Canvas, который предоставляет нам DrawScope — декларативный stateless API для рисования фигур и контуров, не требующий от пользователей понимания базового состояния самого холста. Реализациям DrawScope также предоставляется информация о размерах, а преобразования выполняются относительно локальных размеров.

Примечание: Jetpack Compose (только для Android) и Compose Multiplatform (Desktop, Android, iOS, web) имеют схожий API для рисования. Скриншоты ниже сделаны на Desktop (macOS), но результат одинаков на всех платформах (смотрите последний скриншот).

Рисуем график сна в Compose

Что такое график сна?

Мы можем считывать или записывать данные сна в Health Connect. Данные сна отображаются в виде сессий и могут быть разделены на стадии :

  • Бодрствование: пользователь бодрствует в течение цикла сна.
  • Легкий сон: пользователь находится в цикле легкого сна.
  • Глубокий сон: пользователь находится в цикле глубокого сна.
  • Быстрый сон: пользователь находится в цикле REM (Rapid Eye Movement) сна.

Эти значения отражают тип сна пользователя в определенном временном диапазоне.

Тип данных SleepSessionRecord состоит из двух частей:

  1. Общая сессия, охватывающая всю продолжительность сна.
  2. Отдельные стадии во время сеанса сна, такие как легкий сон или глубокий сон.

Математика

Во время сеанса сна мы можем находиться в одной и той же стадии много раз в разные моменты времени. Нам нужно рассчитать начальную и конечную точки относительно самого сеанса сна.

Чтобы нарисовать прямоугольник в Compose, нам нужны topOffset и size.

Рисуем график сна в Compose

Рисуем график сна в Compose

Рисование

Давайте создадим наш кастомный холст для рисования одной из стадий сна, например, глубокого.

Если мы запустим проект с заданной ранее сессией сна, то увидим 3 прямоугольника: 1 серый прямоугольник для фона и 2 фиолетовых прямоугольника для стадии глубокого сна.

Рисуем график сна в Compose

Чтобы нарисовать все стадии сна (бодрствование, REM, легкий и глубокий), нам нужно внести несколько изменений, чтобы нарисовать каждый тип стадии как компонент Column, вертикально, рисуя линию за линией и применяя некоторое смещение для следующей линии.

Рисуем график сна в Compose

Отрисовка текста

Чтобы нарисовать текст в Compose, мы обычно используем композит Text. Однако в нашем примере мы находимся в DrawScope и можем использовать метод DrawScope.drawText().

Отрисовка текста работает немного иначе, чем другие команды рисования. Обычно мы задаем команде рисования размер (ширину и высоту), в котором нужно нарисовать фигуру/изображение. В случае с текстом есть несколько параметров, которые управляют размером отрисованного текста, например размер шрифта, сам шрифт, лигатура и расстояние между буквами. Нам нужно использовать TextMeasurer, чтобы получить измеренный размер текста в зависимости от вышеперечисленных факторов.

Рисуем график сна в Compose

Рисуем график сна в Compose

Полный пример находится в моем репозитории: https://github.com/vitoksmile/Sleep-timeline-graph.

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: