Дизайнеру приложений: как создать и передать в разработку тёмную тему
В конце 2019 года зарелизили iOS 13 и Android 10 с поддержкой автопереключения на тёмную тему. Мы решили добавить её в приложение «Ростелеком Ключ» под iOS и Android, над которым работали в тот момент.
В процессе не обошлось без сложностей. Рассказываем о нашем опыте, чтобы вы в аналогичной ситуации сэкономили время и нервы.
Зачем делать тёмную тему
Может показаться, что это всё на волне хайпа. Но не только.
Тёмная тема — функциональное улучшение. Она нужна приложениям, которые используют в условиях низкой освещённости. Чтобы понять, почему это так, надо немного углубиться в устройство нашего зрения.
Если мы выходим из тёмного помещения в светлое, то ненадолго «слепнем», но привыкаем к новым условиям уже через 4–6 минут. Когда же мы переходим из светлого места в тёмное, адаптация занимает больше времени: в среднем 30–45 минут.
Если человеку постоянно приходится переводить взгляд между ярким приложением и тёмным окружением, адаптация к яркому дисплею будет быстрой, а вот обратная адаптация к темноте — медленной.
По этой причине некоторые приложения, например навигаторы, выпустили тёмные темы раньше операционных систем. Если человек едет по дороге ночью, важно, чтобы экран навигатора не отвлекал от движения.
В нашем случае приложение «РТ Ключ» — кросс-платформенный сервис для управления устройствами на территории дома: домофонами, шлагбаумами, камерами видеонаблюдения во дворе и в подъезде. Жители домов используют его как днём, так и ночью.
Справедливо заметить, что тёмная тема также помогает экономить заряд (для некоторых типов экранов: OLED/amoled — да, LCD — нет). А в долгосрочной перспективе она может замедлить развитие близорукости.
Как перейти на тёмную сторону: пошаговая инструкция
Если вы совсем ничего не знаете о тёмной теме, то можно начать знакомство со статей в Human Interface Guidelines для iOS и в Material Guide для Android. Там подробно разобрано, как цвета и слои взаимодействуют друг с другом в ночном режиме. Перейдём к нашим советам:
1. Приведите в порядок макеты и соберите UI kit
UI kit серьёзно ускоряет работу дизайнера и разработчиков. Обычно мы собираем его сразу после утверждения визуальной концепции на примере нескольких основных экранов приложения. В UI kit входят:
- Цветовая палитра стилей для обычного состояния элементов, состояния при нажатии, цвета для неактивных элементов, инпутов в фокусе и так далее.
- Текстовые стили.
- Все элементы интерфейса (кнопки, поля ввода, элементы списков, блоки с заголовками и так далее) в различных состояниях и ситуациях в виде master components.
- Сет иконок в черном цвете.
- Иллюстрации.
UI kit нашего приложения можно рассмотреть в Figma.
Все последующие экраны собираем уже из готовых компонентов. Но при экспорте макетов из Sketch в Figma наш UI kit серьёзно пострадал: пришлось его обновить, заново назначить цветовой стиль для каждого элемента и пересобрать экраны из компонентов.
2. Договоритесь о названиях цветов
Чтобы дизайнерам, iOS и Android-разработчикам было проще общаться между собой, цвета мы решили назвать универсально для обеих платформ. В прошлой версии UI kit цветовые стили мы обозначили незатейливо — по номерам: C1, C2, C3… Это было не слишком удобно: при обсуждении все называли цвета не по цифрам, а по оттенкам: фиолетовый, оранжевый, чёрный и т. д.
Однако с появлением тёмной темы использовать оттенки в наименовании цветов стало невозможно: например, белый цвет фона в светлой теме сменился на тёмный. Значит, нужно было придумать новый принцип наименований.
После нескольких встреч с участием всей команды определили, что название цвета должно зависеть от его назначения и состоять из следующих частей:
- Назначение цвета или элемент, на котором он используется.
- Приоритетность использования (опционально).
- Состояние элемента, если это применимо (опционально).
В общем, если в вашем проекте ещё нет UI kit, а вместо цветовых стилей назначены обычные цвета, пора «причесать» макеты.
3. Подберите цвета для тёмной темы
3.1. Фоновый цвет
Начать перерисовку макета стоит с фонового цвета: он занимает большую часть экрана. В гайдах Material Design советуют брать за основу нейтральный тёмно-серый (#121212). Он, в отличие от черного, оставляет простор для построения «глубины» экрана.
Фоновый цвет должен хорошо сочетаться с цветом интерактивных элементов: кнопок, иконок и т. д. У нас в светлой палитре для интерактивных элементов использовался фирменный фиолетовый цвет «Ростелекома» — #7700ff. В дальнейшей работе отталкивались от него.
Нейтральный тёмно-серый плохо смотрелся с брендовым фиолетовым, поэтому мы последовали советам гайдлайнов Material Design. Ребята рекомендуют наложить поверх нейтрального фонового серого #121212 фирменный цвет с 8% непрозрачности.
Помимо основного фона у нас встречаются карточки с небольшим «подъемом» над поверхностью. В Material Design рекомендуют в тёмной теме создавать элевацию элементов за счёт осветления фона: чем ближе карточка к пользователю, тем светлее.
Подобрать подходящие цвета можно, накладывая на фоновый цвет полупрозрачный белый слой. Мы так и сделали.
3.2. Создание базовой палитры
В Material Design рекомендуют при создании брендированной тёмной темы заменять цвета на менее насыщенные аналогичного оттенка. В качестве фирменного цвета для «РТ Ключ» мы использовали фиолетовый.
При попытке осветлить его по рецепту Material Design его оттенок стал розоватым. Оригинальный фирменный цвет выглядел «синее», поэтому мы вручную изменили его оттенок.
В светлой теме мы использовали один фиолетовый цвет для больших кнопок, линейных иконок и навигационной панели (navbar). При подборе цветов для тёмной темы мы не смогли найти фиолетовый оттенок, который бы одинаково удачно смотрелся на всех этих формах.
Navbar и крупные кнопки в осветленной фиолетовой версии особенно сильно отвлекали внимание от контента, а если мы снижали яркость, линейные иконки терялись на тёмном фоне.
Пришлось как в тёмной, так и в светлой теме заменить один исходный цвет на три: один для контурных иконок, второй для больших кнопок с фоном, третий для «уголка» на главном экране и navbar на остальных.
Помимо фиолетового мы использовали оранжевый, желтый, бирюзовый и красный. Оранжевый — для call to action элементов, желтый — для уведомлений, бирюзовый — для подтверждения операции, красный — для ошибок.
Когда мы осветлили эти четыре цвета по совету Material Design, серьезно изменилась контрастность приложения по сравнению со светлой темой. Пришлось отступить от гайдов: оранжевый, бирюзовый и красный мы не осветлили, а затемнили. Жёлтый оставили неизменным, поскольку при затемнении он «грязнил».
3.3. Особенности палитры iOS
В iOS можно задать оттеночный цвет (он же tint), которым будут окрашены все интерактивные элементы: кнопки, иконки, переключатели и т. д. Например, в «настройках» iPhone используется синий цвет, а в приложении «часы» — оранжевый.
В светлой теме у нас tint совпадает с цветом больших кнопок, а в тёмной теме мы сделали его чуть светлее, чтобы линейные иконки были хорошо различимы на тёмном фоне.
В iOS заложена возможность менять цвет интерактивных элементов при нажатии. Это полезно, так пользователю сразу понятно, отреагировало приложение на его действие или нет.
По умолчанию цвет при нажатии становится полупрозрачным. Мы же подумали, что интереснее будет смотреться, если при нажатии кнопки будут «углубляться», то есть темнеть.
3.4. Особенности палитры Android
В Android при нажатии на интерактивный элемент от точки прикосновения к нему расходится волна. Этот эффект называет ripple. По умолчанию ripple немного затемняет исходный элемент, а мы хотели его, наоборот, осветлять.
Также в Android есть особенности отрисовки status bar и navigation bar. Status bar — строка состояния, где отображаются уведомления, уровень сигнала, заряд батареи и время. Navigation bar — панель, где располагаются кнопки назад, домой и недавние приложения.
С появлением смартфонов с крупными дисплеями, доходящими до самого края устройства, «челками» и «дырками» под камеру, в Material Design представили концепцию edge to edge. Её суть в том, что служебные элементы не должны «съедать» полезную площадь, и как можно большее место на экране должен занимать полезный контент.
Для этого в Android доработали поддержку прозрачных status bar и navigation bar. Дело в том, что эти панельки не на всех телефонах имеют одинаковую высоту. И если до начала поддержки edge to edge мы назначали им прозрачный фон, на некоторых устройствах они некрасиво накладывались на контент экрана. Теперь в материальных компонентах появились системные отступы: разработчики могут определять размер status bar и navigation bar и задавать соответствующий отступ для контента. Поэтому раньше в Material Design рекомендовали выбирать непрозрачный фон для status bar и navigation bar, а теперь — наоборот.
Однако важно учитывать, что не во всех поддерживаемых версиях Android можно назначить цвет иконок в системных компонентах:
- до 6.0 иконки в status bar и navigation bar всегда белые;
- с версии 6.0 можно задать, белыми или черными будут иконки в status bar, но navigation bar будет вести себя так, как в предыдущих версиях.
- с версии 8.1 можно выбрать цвет иконок как в status, так и в navigation bar.
Чтобы избежать странных наложений на контент в «Ключе», мы поступили так:
- в старых версиях Android до 6.0 для обеих панелек задали черный фон с 50% прозрачности — на нем хорошо смотрятся белые иконки;
- с 6.0 и до 8.1 navigation bar остается с полупрозрачным черным фоном, а status bar полностью прозрачный;
- с версии 8.1 — фон обеих панелек полностью прозрачный.
Если вы по каким-то причинам не готовы к такой поддержке edge to edge, лучше сделать status bar и navigation bar универсальными. Поддержка edge to edge:
3.5. Проверьте контрастность элементов
Прежде чем утвердить цветовую схему для тёмной темы и перейти дальше, проверьте, достаточно ли она контрастна. Дело в том, что людям, особенно если у них неидеальное зрение, плохой экран или они открыли приложение на ярком солнце, будет трудно разглядеть слабо контрастирующие с фоном элементы. Особенно, если эти элементы состоят из тонких линий — как текст и линейные иконки.
Лучше всего проверять контрастность с помощью тестирования: открыть интерфейс на смартфоне, используя Figma Mirror или аналогичный софт, выйти на яркое солнце (тёмная тема предназначена для использования в темноте, но людям ничто не помешает использовать её на свету).
Также будет полезно попросить посмотреть на приложение людей с нарушениями зрения (близорукостью, дальнозоркостью, дальтонизмом). Но если такой возможности нет, контрастность можно проверить на сайте contrast-ratio или с помощью плагина в Figma.
3.6. Иллюстрации и анимации
Если в вашем приложении используются иллюстрации, для тёмной темы их придётся перекрашивать. Насыщенные цвета, которые отлично смотрятся на светлых поверхностях, на тёмных режут глаз и затрудняют восприятие. Используйте менее насыщенные тона.
Как передавать в разработку
Мы работали в связке Figma + Zeplin. Это может показаться странным, но мы всей компанией перешли на Figma из Sketch в конце лета 2019, прямо перед началом работы нам тёмной темой. И чтобы сэкономить время на адаптацию разработчиков к новому инструменту, продолжили работать с Zeplin. И тут он преподнес нам несколько сюрпризов.
В палитре Zeplin нельзя создать цветовые стили с одинаковыми HEX. Поэтому нам пришлось незначительно, практически незаметно для глаза, менять HEX у фиолетового цвета в светлой теме.
1. Особенности iOS dev
Следующий сюрприз, который нам преподнес Zeplin: из него можно экспортировать только одну палитру в Xcode-проект. Либо светлую, либо тёмную. При попытке экспортировать цвета тёмной палитры Zeplin просто заменял ими все светлые. Мы стали переносить цвета вручную, копируя HEX-значения. То же самое делали и с изображениями.
2. Особенности Android dev
На Android тёмная тема доступна на всех версиях ОС (мы тестировали начиная с пятой). Но переключать её в системе можно только на 10-м Android, поэтому стоит добавить в приложение возможность переключать её вручную.
В Android есть своя система цветов для материальных компонентов (кнопок, app bar, текстовых полей и т. д.). Гайдлайны Material Design о цвете.
Важно сопоставить вашу палитру с материальной с помощью описания темы приложения. Вот статья, которая поможет вашим Android-разработчикам разобраться, как это сделать. Но даже после этого может сохраниться проблема с неправильными цветами. Чтобы это исправить, можно описать стиль конкретного компонента.
Как поддерживать и развивать
С тех пор как мы проработали тёмную тему, у нас добавилось несколько новых функций, появились планшетные пользователи, а продуктовый офис в Ростелекоме задумался о том, чтобы выпустить приложение «РТ Ключ» в виде white label для застройщиков — в их фирменных цветах.
Вторая версия дизайна приложения в той же цветовой палитре:
Скачать нашу утилиту можно здесь.
В ближайшие пару месяцев мы передаем дизайн приложения в «Ростелеком Инфотех», и ребята как раз ищут дизайнера для работы над мобильными приложениями для iOS и Android.
Выводы: как у нас, только лучше
Если в вашем приложении нужна тёмная тема, её лучше всего заложить на старте, сразу после утверждения визуальной концепции. Это поможет избежать почти всех проблем, с которыми столкнулись мы. Как это делать:
- Соберите UI kit.
- Продумайте систему наименования цветов или воспользуйтесь нашей.
- Подберите брендированный фоновый цвет.
- Подберите оттенок для основного и второстепенных фирменных цветов.
- Если ваше приложение кроссплатформенное, составьте список отличий цветовых схем iOS и Android. А также проверьте, не нужно ли добавить в приложение на Android ручную настройку тёмной темы.
- Проверьте контрастность выбранных цветов.
- Подготовьте иллюстрации и анимации для тёмной темы.
- Обновите UI kit.
- Воспользуйтесь нашей утилитой для передачи элементов в разработку.
Полезные материалы
Чтобы ещё глубже погрузится в тёмную тему:
- для знакомства с теорией цвета — Йоханнес Иттен «Искусство цвета»;
- для знакомства с тем, как разные цвета взаимодействуют друг с другом, — Джозеф Альберс «Взаимодействие цвета»;
- быстрое погружение, для тех, кому некогда читать теорию, — гайдлайны Material Design о создании тёмной темы;
- и аналогичные гайдлайны для iOS;
- сессия с WWDC 2019 про дизайн тёмной темы для iOS;
- основы проектирования тёмной темы для разных операционных систем в коллекции Юрия Ветрова.
И немного полезностей для разработчиков:
- сессия с WWDC 2019 про тёмную тему для iOS;
- создание тем и стилей в Android приложениях;
- Работа с материальными компонентами на Android.
#BlackThemeMatter
Цепляющий заголовок)) Всегда любила тёмные темы в приложениях больше стандартных.
Вот прям не дождусь, когда эта истерия с темными темами пройдет.
Надеюсь, не дождешься. Благодаря темной теме я все еще вижу и сплю хотя бы 2 часа
ну вот, все секреты рассказали😄 теперь придётся выдумывать новые 🙈
"После долгих мучений я написал утилиту, которая выгружает обе цветовые палитры прямо в Xcode-проект, используя Zeplin API"
Молодец! Спасибо, что выложили код!
Ада, ❤️
Макеты симпатишные :)
Спасибо за толковую статью и отдельное спасибо за исходники — люблю, когда можно не только почитать, но и поковырять макеты)
Удивлён, кстати, что в «Полезных материалах» нет упоминания замечательного плагина, упрощающего создание и тестирование тёмных / светлых тем: https://www.figma.com/community/plugin/760927481606931799/Appearance
P.S. Да, раз уж вы затрагиваете тему контрастности в интерфейсах, то, думаю, вам стоит пофиксить некоторые досадные недочёты >___<
Да, вещь! Про плагин Appearance как раз вчера рассказали в дизайн джеме, кстати) https://t.me/design_jam/331
Да, пофиксим:) Спасибо!
Хорошая статья!) Не думаете что супер насыщенный фиолетовый и оранжевый в темной теме не состыковывается с целью темной темы? Вы проверяли как в темноте ощущаются эти цвета и т.д.?
Спасибо 🤗
Если посмотреть картинку с 3 фиолетовыми, то там видно, что мы его приглушили значительно. Плюс, возможно, мокапы в статье так отображаются — мы всё-таки проверяли макеты непосредственно в приложении на телефоне.
Но на последних изображениях видно, что мы отказались от такого количества фиолетового в интерфейсе. В темноте, кстати, проверяли, но только на себе)
огромное спасибо!
как раз делаю темную тему!
Комментарий недоступен
Хороший вопрос. Но мы для ripple назначили два непрозрачных цвета в каждой теме. Один для фиолетовых кнопок, один для «невидимых» на белом или сером фоне. Если попадется такой инструмент — поделимся.
Я тестирую еще темную палитру обязательно вечером, когда зачастую включен Night Shift
Угу, тоже полезно!
Ребята, а вот вы по примеру материала серый фон подкрашиваете, а как вы относитесь к серому фону в светлой теме? Если ли резон его немного "брендировать"? Не так, чтобы он стал цветным, но стал ближе к гамме палитры?
Положительно относимся:) У нас в светлой теме фоновый серый тоже немного синеватый.
Статья супер! Действительно полезная и хорошо структурированная работа 👍🏽
Очень актуально - темные палитры весьма актуальны и обязательно должны присутствовать для выбора заказчиком. Обсудим и поэкспериментируем при создании приложений для iOS https://www.app2lab.ru/services1.php
Сколько лет дизайнеры будут рассказывать про юйкиты и придумывать дебильный нейминг для цветов? И пользоваться зеплин костылями? Видимо столько же сколько другие люди будут каждый день штамповать видосы про твиттер бутстрап. Как же человечество жалко. Тёмные темы делать в принципе легче чем светлые, но похайпить написать воды обязательно нужно да.
"Вывод: лучше знать что мы будем делать тёмную тему на старте" да вы чтооо... А если знать заранее что проект не взлетит можно вообще нихрена не делать.