Где найти файл items android
Каждому Android-разработчику так или иначе приходилось работать со стилями. Кто-то чувствует себя с ними уверенно, у кого-то есть только поверхностные знания, которые зачастую не позволяют самостоятельно решить поставленную задачу.
В преддверии выхода темной темы было решено освежить в памяти всю информацию, касающуюся тем и стилей в Android-приложениях.
О чем пойдет речь:
- Рассмотрим основные понятия тем и стилей в Android-приложениях, посмотрим какие возможности они нам предоставляют;
- Создадим простейшую тему с использованием Material Components и поиграемся с переопределением стилей;
- Разберемся, как работает темная тема;
- Сформулируем рекомендации для работы со стилями.
Начнем с основ
По своей структуре темы и стили имеют общее строение:
Для создания используется тег style . У каждого cтиля есть имя и он хранит в себе параметры key-value .
Все достаточно просто. Но в чем же разница между темой и стилем?
Единственное отличие заключается в том, как мы их используем.
Тема — это набор параметров, которые применяются ко всему приложению, Activity или View-компоненту. Она содержит базовые цвета приложения, стили для отрисовки всех компонентов приложения и различные настройки.
В теме переопределены основные цвета приложения ( colorPrimary , colorSecondary ), стиль для текста ( textAppearanceHeadline1 ) и некоторых стандартных компонентов приложения, а также параметр для прозрачного статус-бара.
Для того чтобы стиль стал настоящей темой, необходимо отнаследоваться (о наследовании мы поговорим чуть позже) от дефолтной реализации темы.
Стиль
Стиль — это набор параметров для стилизации одного View-компонента.
Атрибут
Атрибутом принято называть ключ стиля или темы. Это маленькие кирпичики из которых все строится:
Все эти ключи являются стандартными атрибутами.
Мы можем создавать свои атрибуты:
Атрибут myFavoriteColor будет указывать на цвет или ссылку на ресурс цвета.
В формате мы можем указать вполне стандартные значения:
По своей природе атрибут является интерфейсом. Его необходимо реализовать в теме:
Теперь мы можем на него ссылаться. Общая структура обращения выглядит так:
Ну и, наконец, давайте поменяем, например, цвет текста у поля:
Благодаря атрибутам мы можем добавлять какие-угодно абстракции, которые будут изменяться внутри темы.
Наследование тем и стилей
Как и в ООП, мы можем перенимать функционал существующей реализации. Сделать это можно двумя способами:
При явном наследовании мы указываем родителя с помощью ключевого слова parent :
При неявном наследовании мы используем dot-notation для указания родителя:
Никакой разницы в работе этих подходов нет.
Очень часто мы можем встретить подобные стили:
Может показаться, что стиль создан путем двойного наследования. На самом деле это не так. Множественное наследование запрещено. В таком определении явное наследование всегда выигрывает.
То есть будет создан стиль с именем Widget.MyApp.Snackbar , который является наследником Widget.MaterialComponents.Snackbar .
ThemeOverlay
ThemeOverlay — это специальные «легковесные» темы, которые позволяют переопределить атрибуты основной темы для View-компонента.
За примером далеко ходить не будем, а возьмем кейс из нашего приложения. Дизайнеры решили, что нам нужно сделать стандартное поле для ввода логина, которое будет иметь отличный от основного стиля цвет.
С основной темой поле ввода выглядит так:
Выглядит отлично, но дизайнеры настаивают на том, чтобы поле было в коричневом стиле.
Окей, как мы можем решить такую задачу?
Да, мы можем переопределить стиль и вручную поменять основные цвета вьюшки, но для этого нужно будет писать много кода, да и есть шанс, что мы про что-нибудь забудем.
Написать свою вьюшку по гайдлайнам и с кастомными параметрами?
Хороший вариант, так мы сможем удовлетворить любые хотелки дизайнеров и заодно прокачать скилл, но все это трудозатратно и может привести к нежелательным багам.
Переопределить основной цвет в теме?
Мы выяснили, что для нужного нам вида достаточно поменять colorPrimary в теме. Рабочий вариант, но так мы затронем внешний вид остальных компонентов, а нам это не нужно.
Правильное решение — это использовать ThemeOverlay.
Создаем ThemeOverlay и переопределяем основной цвет темы:
Далее указываем его с помощью специального тега android:theme в наш TextInputLayout :
Все работает так, как нам и нужно.
Конечно же возникает вопрос — как это работает под капотом?
Эту магию позволяет провернуть ContextThemeWrapper . При создании View в LayoutInflater будет создан контекст, где за основу будет взята текущая тема и в ней будут переопределены параметры, которые мы указали в нашей Overlay теме.
Аналогичным образом мы можем самостоятельно переопределить любой параметр темы в приложении.
Последовательность применения тем и стилей ко View-компоненту
Главный приоритет имеет файл разметки. Если в нем определен параметр, то далее все аналогичные параметры будут игнорироваться.
Следующий приоритет имеет стиль View:
Далее используются предопределенные стили для компонента:
Если параметры не были найдены, то используются атрибуты темы:
В общем-то это все, что нужно знать для того чтобы начать работу с темами. Теперь кратко посмотрим на обновленную дизайн-библиотеку Material Components.
Перейдем к практике
Для создания темы нужно отнаследоваться от базовой темы:
Все они очень похожи на AppCompat темы, но имеют дополнительные атрибуты и настройки.
Подробнее с новыми атрибутами можно познакомиться на material.io.
Если по каким-то причинам вы сейчас не можете переключиться на новую тему, то вам подойдут Bridge темы. Они наследуются от AppCompat тем и имеют все новые атрибуты Material Components. Нужно всего лишь добавить постфикс Bridge и использовать все возможности без опасений:
А вот и наша тема:
Имена основных цветов (brand-цветов) претерпели изменения:
Дополнительную информацию по цветам можно найти на material.io.
Я уже упоминал, что тема содержит стандартные стили для каждого View-компонента. Например, для Snackbar стиль будет называться snackbarStyle , для checkbox — checkboxStyle и далее все по аналогии. Пример расставит все на свои места:
Создадим свой стиль и применим его к теме:
Важно понимать, что когда вы переопределяете стиль в теме, он применится ко всем View этого типа в приложении (Activity).
Если же вы хотите применить стиль только к одной конкретной View, то нужно использовать тег style в файле с разметкой:
Одно из нововведений, которое меня действительно впечатлило — это ShapeAppearance. Оно позволяет изменять форму компонентов прямо в теме!
Каждый View-компонент относится к определенной группе:
shapeAppearanceSmallComponent
shapeAppearanceMediumComponent
shapeAppearanceLargeComponent
Как мы можем понять из названия, в группах вьюшки разных размеров.
Проверим на практике:
Мы создали Widget.MyApp.SmallShapeAppearance для "маленьких" компонентов. Закруглили верхний левый угол на 20dp и правый нижний угол срезали на 15dp .
Получили такой результат:
Выглядит интересно. Будет ли это работать в реальной жизни? Время покажет.
Как и для стилей, мы можем применить ShapeAppearance только для одного View-компонента.
1. Разделы внутренней памяти
Внутренняя память устройства на андроиде разбита на несколько логических дисков (разделов).
Приведу только основные:
Bootloader – здесь находится микропрограмма (загрузчик), позволяющая запускать операционную систему, рекавери и другие сервисные режимы.
Recovery – как видно из названия, тут установлено инженерное меню восстановления или просто Рекавери.
Boot – сердце Андроид ОС, тут находится ядро, драйвера и настройки управления процессором и памятью.
System – системный раздел, в котором находятся все, необходимые для работы Android ОС, файлы, это как папка Windows на вашем диске С:\ (здесь и далее буду проводить ассоциацию с ОС Windows)
Data – раздел для установки приложений и хранения их данных. (Program files)
User – это всем известная sdcard или, проще говоря, место под пользовательские файлы (Мои документы). Здесь я вынужден сделать отступление, т.к. размещение данного раздела имеет несколько вариантов:
- Раздел отсутствует во внутренней памяти, а вместо него используется внешний накопитель — самый популярный вариант. (рис.1)
- В устройствах со встроенной памятью большого размера, данный раздел видится какsdcard, а внешняя карта памяти видится какsdcard2илиextsd(могут быть и другие варианты названия). Обычно, встречается на устройствах сAndroid3.2. (Рис.2 Вариант 1)
- Данный вариант пришел на смену предыдущему варианту, вместе с Андроид 4.0. РазделUserзаменили папкойmediaна разделеData, что позволило использовать всю доступную пользователю память для установки программ и хранения данных, а не то количество, что выделил нам производитель. Иными словамиsdcardиdataявляются одним целым. (Рис.2 Вариант 2)
Да прибудет с нами Material Components
Material Сomponents была представлена на Google I/O 2018 и является заменой Design Support Library.
Библиотека дает нам возможность использовать обновленные компоненты из Material Design 2.0. Кроме того, в ней появилось множество интересных настроек по кастомизации. Все это позволяет писать яркие и уникальные приложения.
Вот некоторые примеры приложений в новом стиле: Owl, Reply, Crane.
Таинственная папка, скрытая от всех
Папка, о которой идет речь, никогда не попадется вам на глаза. Дело в том, что разработчики программного обеспечения всегда стараются скрыть ее, поскольку не относят к числу важных. Эта папка имеет название .thumbnails.
4. Root
— Знать что в какой папке это хорошо, но можно ли что-то с этим сделать?
— Да! Но нужны права суперпользователя (root) или, если проводить аналогию с Windows, права Администратора. Изначально все устройства на Андроид идут без root прав для конечного пользователя, т.е. покупая девайс, мы не являемся в нем полноценными хозяевами. Это сделано как для защиты от вредоносных программ, так и от самого пользователя – ведь, в неумелых руках, полный доступ к системе может привести к «смерти» операционной системы и последующей необходимости в перепрошивке устройства.
«Ну и в чем польза такой опасной штуки?» — спросите Вы.
- Возможность делать резервные копии данных и восстанавливать их после прошивки или случайного удаления.
- Тонкая настройка системы вручную или при помощи специальных программ.
- Удаление системных приложений, мелодий, обоев и т.п.
- Изменение внешнего вида ОС (например, отображение заряда батареи в процентах)
- Добавление функционала (поддержкаad—hocсетей, к примеру)
Данный список можно продолжать еще долго, но, думаю, данных примеров будет достаточно для представления о возможностях и широте применения root привилегий.
— Это все здорово, но теперь любая программа сможет получить доступ к «сердцу» операционки и моим данным?
— Нет. Вы сами решаете разрешить, тому или иному приложению, получить root доступ, или нет. Для этого существует программа Superuser или ее продвинутая сестра SuperSU. Без этой или подобной программы воспользоваться root не возможно.
Содержание:
Пошаговая инструкция по исправлению зеркального тачскрина на планшете Prestigio Wize 3131 3G (PMT3131_3G_D).
Необходимые файлы:
1) Драйвер – Driver_Auto_Installer-v5.1632.00.zip
2) Утилита для прошивки – SP_Flash_Tool_exe_Windows_v5.1844.00.000.zip
3) scatter и items файлы – scatter_items_PMT3131_3G.zip
Внимание! Все действия вы совершаете на свой страх и риск! За возможное нарушение работоспособности аппарата администрация сайта и автор статьи ответственности не несут! × Отклонить предупреждение
- Извлекаем содержимое архивов в корень диска “С:\” (путь к файлам не должен содержать русских букв) и запускаем установку драйверов: файл “Driver_Auto_Installer-v5.1632.00.exe“.
Установка стандарта: нажимаем “Instal“, соглашаемся на установку нажимаем “Да“, по завершении нажимаем “Ok“, “Finish” и перезагружаем компьютер.
- После перезагрузки компьютера открываем «Диспетчер устройств» и подключаем выключенный планшет кабелем USB к компьютеру. Начнётся установка драйвера и после успешной установки в «Диспетчере устройств» в разделе «Порты (COM и LPT)» появится подключенный планшет под названием «MediaTek PreLoader USB VCOM (Android)».
Если драйвер не успел установиться, то выдерните и снова подключите шнур USB.
- Редактируем файл items.ini:
Открываем его в стандартном блокноте Windows, через поиск находим touchpanel.x.reverse
- Меняем значение touchpanel.x.reverse на “1” – развернуть по оси Х.
- Затем следующий за ним файл touchpanel.y.reverse тоже меняем значение на “1” – развернуть по оси Y .
- Сохраняем изменения.
Бывают разные случаи реверса, кому-то нужно будет прошить с нулями не меняя на 1, кому-то поменять только по оси X или по оси Y, можно пробовать разные комбинации.
Ваш смартфон постоянно требует новую порцию памяти, но удалять уже нечего? Выход есть! Ищите скрытую папку, где хранится все то, что вам точно не нужно, но занимает много памяти. В статье рассказывается, где найти папку, как ее очистить и удалить.
Заключение
В заключение хочется сказать, что стилизация приложения — это обязанность не только разработчиков, но и дизайнеров. Только благодаря тесному взаимодействию мы сможем получить по-настоящему хороший и красивый продукт. Дизайнеры должны иметь представления о платформе и возможностях Material Components. Ведь именно на их плечи ложится ответственность по поддержке визуальной составляющей приложения. Дизайнерам доступен специальный плагин для Sketch — Material Theme Editor. В нем очень просто выбирать цвета для приложения и строить экраны на основе стандартных компонентов. Если ваши дизайнеры еще не знают о нем, то обязательно расскажите им.
Начать изучать Material Components можно с репозитория на GitHub — Modular and customizable Material Design UI components for Android. В нем собрано очень много информации по стандартным стилям и их возможностям. Кроме того, там есть приложение — sample, чтобы все сразу попробовать на практике.
С Supra M121G решил перепрошивкой в Turbopad, решение нашел на ****.
OzyaXP
Помоему все гораздо проще, с дигмой TT1002MG получилось, зеркалил по одной оси. теперь нормально! (тач не родной стоял XC-PG1010-019-A0 XLY Поставил FPC032H V1.0)
jericho13
supra m12 cg
зеркалил по X, ориг не пошел, с прошивкой от TX59 автоповорот достал, подходит прошивка от m12bg, но результат тоже, выложенная здесь прошивка от CG не стартует у меня, пришлось колхозить
jericho13
*убрать подчёрточки в ****
edwrd666
Да можно проще, ставим любой подходящий по размеру тач и в файле Items.ini ( в папке с прошивкой для FT) в блокноте редактируем строчки touchpanel.x.reverse и touchpanel.y.reverse , нолик меняем на единицу или наоборот, смотря кому ,что нужно ( еще есть swap, он меняет местами x и y) и сохраняем и шьем только этот файлик из прошивки и все.
BURZUM
Да можно проще, ставим любой подходящий по размеру тач и в файле Items.ini ( в папке с прошивкой для FT) в блокноте редактируем строчки touchpanel.x.reverse и touchpanel.y.reverse , нолик меняем на единицу или наоборот, смотря кому ,что нужно ( еще есть swap, он меняет местами x и y) и сохраняем и шьем только этот файлик из прошивки и все.
Да можно проще, ставим любой подходящий по размеру тач и в файле Items.ini ( в папке с прошивкой для FT) в блокноте редактируем строчки touchpanel.x.reverse и touchpanel.y.reverse , нолик меняем на единицу или наоборот, смотря кому ,что нужно ( еще есть swap, он меняет местами x и y) и сохраняем и шьем только этот файлик из прошивки и все.
А вот если нет этого файла items- в прошивке . Как его вытянуть из прошивки? Контроллер тачскрина gsl-915. Пробовал брать items от супра, менял значения, прошивал все норм. Изменений никаких. В скаттере родной прошивки items тоже не прописан, опять же брал скаттер от супра, толку ноль.
UnEvi
народ помогите пжл телефон асус k00g заказал на него тач с алиэкс. поставил работает в зеркальном отражении что делать?мож кто что знает?
народ помогите пжл телефон асус k00g заказал на него тач с алиэкс. поставил работает в зеркальном отражении что делать?мож кто что знает?
sash83
kazsopin
Встречал на **** такое:
В файлах прошивки находим, файл items.ini , открываем его в текстовом редакторе и находим строки touchpanel.x.reverse и touchpanel.y.reverse , меняем на против них значения с нуля на единицу и с единицы на ноль, сохраняем файл и прошиваем прошивку флештулом. Можно прошить только items.ini, тогда не потеряются данные.
Попробуйте. Может поможет. Частенько этого файла нет. Иногда он есть в самом аппарате и его можно вытащить флештулом по readback, изменить а потом залить обратно. В некоторых аппаратах даже раздела такого нет. Посмотрите прошивку, потом сам scatter. Если есть в прошивке или хотя бы в скаттере, то пробуйте.
sash83
Встречал на **** такое:
В файлах прошивки находим, файл items.ini , открываем его в текстовом редакторе и находим строки touchpanel.x.reverse и touchpanel.y.reverse , меняем на против них значения с нуля на единицу и с единицы на ноль, сохраняем файл и прошиваем прошивку флештулом. Можно прошить только items.ini, тогда не потеряются данные.
Попробуйте. Может поможет. Частенько этого файла нет. Иногда он есть в самом аппарате и его можно вытащить флештулом по readback, изменить а потом залить обратно. В некоторых аппаратах даже раздела такого нет. Посмотрите прошивку, потом сам scatter. Если есть в прошивке или хотя бы в скаттере, то пробуйте.
К сожалению нет файла Items в прошивке на эту модель, уже изучил эту тему на ****. Решил попробовать прошить от TX59, предварительно сделал бэкап, судя по характеристикам похожие модели.
Как сделать, чтобы папка не наполнялась
Удалив содержимое папки .thumbnails всего раз, хозяин смартфона почти всегда приятно удивляется освобожденному объему памяти. Обычно он составляет от 500 Мб до 1 Гб. У одних больше, у других меньше. Все зависит от вашей любви к фотографиям и картинкам.
Но ведь потом эта папка снова наполняется эскизами изображений, постепенно заполняя память по второму кругу. Этого можно избежать. Нужно подсоединить смартфон к компьютеру и проделать следующие действия:
- Полностью удаляем из смартфона папку .thumbnails (не только содержимое, а саму папку).
- Создаем на компьютере текстовый файл, называем его .thumbnails.
- Переносим созданный файл в папку DCIM.
Файл можно создавать и прямо в смартфоне.
Этими простыми действиями вы сумеете заблокировать смартфону возможность создания новой директивы с таким же названием, поскольку двух файлов с одинаковым названием в устройстве быть не может.
С помощью этих простых действий вы сможете надолго избавить себя от постоянных требований смартфона освободить часть памяти для его нормальной работы.
Общаясь на форумах и являясь куратором нескольких тем, часто сталкиваюсь с полным непониманием новичков об устройстве андроида. «Ну, а зачем обычному пользователю знать это?» — скажете вы. И тут я с вами соглашусь, задав встречный вопрос: «А зачем тогда обычный пользователь лезет в дебри прошивок, root доступа и твиков системы, не понимая в этом ничего?». Именно это и натолкнуло меня на написание данной статьи, в которой я попытаюсь, обычным и понятным языком, донести сложные вещи.
Материал направлен, в первую очередь, на обычных пользователей. Поэтому здесь будет представлена сжатая и поверхностная информация без технических углублений и нюансов.
3. Внутренности системы
Разобравшись с теорией, давайте запустим Андроид ОС.
Нажимаем кнопку питания — запускается Bootloader, который загружает Ядро (boot), оно, в свою очередь, запускает систему (System), ну, а она уже подгружает программы (data) и пользовательское пространство (user). (Рис.3)
А теперь перейдем в корневой каталог и посмотрим на внутренности самой Android OS:
В этой схеме я привел, только необходимые для ознакомления, директории. На самом деле их гораздо больше и на обзор только одной папки System понадобится целая статья.
И так, папка data. Как можно догадаться из названия, она как-то связана с данными, но с какими? Да практически со всеми, это и данные о синхронизации и аккаунтах, пароли к точкам доступа wifi и настройки vpn, и так далее. Среди всего прочего тут можно обнаружить папки app, data и dalvik—cache – рассмотрим их назначение:
- app – сюда устанавливаются программы и игры.
- data – здесь хранятся данные приложений, их настройки, сэйвы игр и прочая информация.
- dalvik—cache — программная область кэш-памяти для программы Dalvik. Dalvik это Java-виртуальная машина, которая является основой для работы программ, имеющих *.apk расширение. Для того, чтобы сделать запуск программ быстрее — создается их кэш.
Папка System хранит в себе системные данные и все необходимое для работы ОС. Давайте рассмотрим некоторые из этих папок:
- app – здесь находятся системные приложения (смс, телефон, календарь, настройки и т.п.), а так же приложения установленные производителем устройства (фирменные виджеты, живые обои и т.д.).
- fonts – системные шрифты
- media – содержит стандартные мелодии звонков, уведомлений, будильников и звуков интерфейса, а так же загрузочную анимацию (bootanimation)
- build.prop – Этот файл упоминается, чуть ли не первым, в разговорах и статьях о тонкой настройке системы. В нем содержится огромное количество настроек, таких как плотность экрана, время задержки сенсора приближения, управление wifi, имя и производитель устройства и многие другие параметры.
2. Bootloader, Recovery, adb и fastboot
Теперь, когда мы знаем, что и где находится, давайте разберемся для чего оно там.
Начнем с Bootloader. Это загрузчик, который запускает Андроид, рекавери и т.п. Когда мы нажимаем кнопку включения, запускается загрузчик и, если нет дополнительных команд (зажатых клавиш), запускает загрузку boot. Если же была зажата комбинация клавиш (у каждого устройства она своя) то запускает, в зависимости от команды, recovery, fastboot или apx. На рисунке ниже наглядно показано, что запускает Bootloader и как взаимосвязаны разделы.
Как видно из рисунка №3, раздел Recovery не влияет на загрузку Андроид ОС, но зачем же он тогда нужен? Давайте попробуем разобраться.
Recovery (рекавери) по сути является маленькой утилитой на ядре Linux и загружается не зависимо от Андроид. Его штатный функционал не богат: можно сбросить аппарат до заводских настроек или же обновить прошивку (заранее скачанную на sdcard). Но, благодаря народным умельцам, у нас есть модифицированные рекавери, через которые можно устанавливать модифицированные (кастомные) прошивки, настраивать андроид, создавать резервные копии и многое другое. Наличие или отсутствие рекавери, а также его версия не влияют на работоспособность Андроид ОС (очень частый вопрос на форумах).
Раз уж зашла речь об интерфейсах, хочу рассказать о еще одном, довольно известном,- adb (android debug bridge). Это, так называемый, режим отладки и назван он так неспроста – через него можно отслеживать работу, как системы в целом, так и отдельных приложений. Но это еще не все, при помощи adb можно получить полный доступ к файловой системе устройства и изменять системные файлы или же вытянуть важную информацию, когда ваш девайс завис на загрузке. Все функции режима отладки описывать не буду т.к. моя цель донести общую информацию, а не подробный обзор о функциях того или иного режима.
Где ее найти
Чтобы отыскать папку .thumbnails, придется немного порыться в материалах, хранящихся в смартфоне. В устройствах, работающих на операционной системе Android, она, как правило, хранится в папке DCIM (в галерее, где находятся все фотографии, снятые на камеру вашего смартфона).
Порядок действий следующий:
- Заходим в галерею.
- Находим папку DCIM и открываем ее.
- Находим папку .thumbnails и открываем ее.
- Выделяем все файлы, хранящиеся в ней.
- Нажимаем "Удалить".
- Подтверждаем действие.
Возможен и другой вариант действий:
- Заходим в "Проводник".
- Выбираем папку "Локальные файлы".
- Листаем почти в самый низ и находим папку .thumbnails, а затем открываем ее.
- Выделяем все файлы, хранящиеся в ней.
- Нажимаем "Удалить".
- Подтверждаем действие.
Папка .thumbnails - это место, в котором хранятся эскизы всех фотографий и скриншотов. Нужны они для того, чтобы в тот момент, когда открывается галерея, картинки быстрее подгружались, но никакой глобальной пользы от содержимого .thumbnails нет. Да, каждый эскиз имеет размер всего несколько килобайт, но в сумме они занимают приличный объем памяти устройства.
Что нам следует учитывать при работе с темами и стилями?
Как я уже отметил, Google начал официально форсить темную тему. Уверен, что от многих заказчиков начали поступать вопросы — «Сможем ли мы добавить темную тему?». Хорошо, если вы с самого начала все делаете правильно и вам не составит труда поменять светлые цвета на темные, получив при этом полностью перекрашенное приложение.
К сожалению, так бывает далеко не всегда. Бывают старые приложения, которые требуют значительных усилий для того, чтобы внести необходимые изменения.
Давайте вместе попытаемся сформулировать рекомендации для работы со стилями:
1. Палитра цветов
Думаю, что каждый разработчик сталкивался с ситуацией когда в новом макете появляется какой-то непонятный цвет, который еще не определен в палитре приложения. Что делать в таком случае?
Правильный ответ — поговорить с дизайнером и попытаться выработать палитру цветов. Сейчас есть множество программ (Zeplin, Sketch и др.), которые позволяют вынести основные цвета и потом переиспользовать их.
Чем раньше вы этим займетесь, тем меньше у вас будет головной боли в дальнейшем.
2. Называть цвета своими именами
В каждом приложении найдется цвет, который имеет множество вариантов яркости. Можно для них начать выдумывать имена:
Согласитесь, выглядит не очень. Сразу возникает вопрос — какой цвет светлее tiny или light ? А если у нас будет десяток вариантов?
Лучше всего придерживаться концепции Google и добавить в имена цветов соответствующую яркость (Google называет это вариантом цвета — colorVariant ):
При таком подходе мы сможем иметь сколько угодно вариантов яркости одного цвета и нам не придется придумывать специфичные имена, а это действительно трудно.
3. Абстрагироваться от конкретного цвета, если он меняется в разных темах
Так как мы пишем приложение в котором будет как минимум две темы, то мы не можем позволить себе ссылаться на конкретный цвет, если он реализуется в темах по-разному.
Давайте рассмотрим пример:
Мы видим, что в светлой теме, например, тулбар окрашен в фиолетовый, а в темной он темно-серый. Как бы нам реализовать такое поведение, используя только возможности тем?
Все достаточно просто — мы создадим атрибут и реализуем его в светлой и темной темах соответствующим цветом, как это описывалось ранее.
Google рекомендует связывать имена атрибутов с семантикой использования.
4. Не бояться создавать ресурсные файлы
Когда в файле styles.xml набирается много различных стилей, тем и атрибутов, то его становится сложно поддерживать.
Лучше всего разнести все по группам в отдельные файлы:
Такое простое правило позволит избежать God-файлов и, следовательно, будет проще поддерживать стили.
5. Переиспользовать по максимуму
Как мы поступим, если захотим переопределить атрибут, который доступен только с определенной версии API?
Мы можем создать две отдельные темы:
Нам теперь на каждую версию API делать тему со всеми параметрами? Нет, конечно! Мы сделаем базовую тему, где будут определены базовые атрибуты, доступные для всех версий API и отнаследуемся от нее в нужной версии API:
По такому принципу построены все темы в стандартной библиотеке.
6. Использовать векторные ресурсы и tint
Думаю, не стоит говорить почему векторные ресурсы — это хорошо. Все и так знают (на всякий случай ссылка на документацию). Ну а tinting поможет нам окрасить их в цвета темы.
Посмотреть что такое tinting и как с ним работать можно в этом примере.
7. ?android:attr/… vs ?attr/.
При обращении к ресурсам у нас есть возможность использовать как системные атрибуты, так и атрибуты из библиотеки Material Components. Важно понимать, что некоторые атрибуты существуют только с определенной версии API. Как мы все хорошо знаем, обращение к несуществующему ресурсу ведет к крэшу (lint, конечно, нам подскажет если что-то не так, но не стоит всегда полагаться на него)
В первом случае мы обращаемся к системному ресурсу, так как указали android . Во втором случае к атрибуту из библиотеки, где реализована обратная совместимость.
Лучше всегда использовать второй вариант.
8. Всегда указывать родителя для стиля
В родительском стиле могут быть параметры, без которых компонент будет неверно отрисовываться, поэтому следует всегда указывать родителя.
9. Тема, стиль или… ?
При созданий собственных тем и стилей будет здорово, если вы укажите префикс, говорящий о том что это за стиль и для чего он определен. Такое именование позволит очень просто структурировать и расширять стили.
10. Использовать TextAppearance
Хорошим тоном будет расширить основные стили для текста и везде их использовать.
Много полезной информации можно найти на сайте Material Design: Typography, Typography Theming.
Начнем с основ
По своей структуре темы и стили имеют общее строение:
Для создания используется тег style . У каждого cтиля есть имя и он хранит в себе параметры key-value .
Все достаточно просто. Но в чем же разница между темой и стилем?
Единственное отличие заключается в том, как мы их используем.
Тема — это набор параметров, которые применяются ко всему приложению, Activity или View-компоненту. Она содержит базовые цвета приложения, стили для отрисовки всех компонентов приложения и различные настройки.
В теме переопределены основные цвета приложения ( colorPrimary , colorSecondary ), стиль для текста ( textAppearanceHeadline1 ) и некоторых стандартных компонентов приложения, а также параметр для прозрачного статус-бара.
Для того чтобы стиль стал настоящей темой, необходимо отнаследоваться (о наследовании мы поговорим чуть позже) от дефолтной реализации темы.
Стиль
Стиль — это набор параметров для стилизации одного View-компонента.
Атрибут
Атрибутом принято называть ключ стиля или темы. Это маленькие кирпичики из которых все строится:
Все эти ключи являются стандартными атрибутами.
Мы можем создавать свои атрибуты:
Атрибут myFavoriteColor будет указывать на цвет или ссылку на ресурс цвета.
В формате мы можем указать вполне стандартные значения:
По своей природе атрибут является интерфейсом. Его необходимо реализовать в теме:
Теперь мы можем на него ссылаться. Общая структура обращения выглядит так:
Ну и, наконец, давайте поменяем, например, цвет текста у поля:
Благодаря атрибутам мы можем добавлять какие-угодно абстракции, которые будут изменяться внутри темы.
Наследование тем и стилей
Как и в ООП, мы можем перенимать функционал существующей реализации. Сделать это можно двумя способами:
При явном наследовании мы указываем родителя с помощью ключевого слова parent :
При неявном наследовании мы используем dot-notation для указания родителя:
Никакой разницы в работе этих подходов нет.
Очень часто мы можем встретить подобные стили:
Может показаться, что стиль создан путем двойного наследования. На самом деле это не так. Множественное наследование запрещено. В таком определении явное наследование всегда выигрывает.
То есть будет создан стиль с именем Widget.MyApp.Snackbar , который является наследником Widget.MaterialComponents.Snackbar .
ThemeOverlay
ThemeOverlay — это специальные «легковесные» темы, которые позволяют переопределить атрибуты основной темы для View-компонента.
За примером далеко ходить не будем, а возьмем кейс из нашего приложения. Дизайнеры решили, что нам нужно сделать стандартное поле для ввода логина, которое будет иметь отличный от основного стиля цвет.
С основной темой поле ввода выглядит так:
Выглядит отлично, но дизайнеры настаивают на том, чтобы поле было в коричневом стиле.
Окей, как мы можем решить такую задачу?
Да, мы можем переопределить стиль и вручную поменять основные цвета вьюшки, но для этого нужно будет писать много кода, да и есть шанс, что мы про что-нибудь забудем.
Написать свою вьюшку по гайдлайнам и с кастомными параметрами?
Хороший вариант, так мы сможем удовлетворить любые хотелки дизайнеров и заодно прокачать скилл, но все это трудозатратно и может привести к нежелательным багам.
Переопределить основной цвет в теме?
Мы выяснили, что для нужного нам вида достаточно поменять colorPrimary в теме. Рабочий вариант, но так мы затронем внешний вид остальных компонентов, а нам это не нужно.
Правильное решение — это использовать ThemeOverlay.
Создаем ThemeOverlay и переопределяем основной цвет темы:
Далее указываем его с помощью специального тега android:theme в наш TextInputLayout :
Все работает так, как нам и нужно.
Конечно же возникает вопрос — как это работает под капотом?
Эту магию позволяет провернуть ContextThemeWrapper . При создании View в LayoutInflater будет создан контекст, где за основу будет взята текущая тема и в ней будут переопределены параметры, которые мы указали в нашей Overlay теме.
Аналогичным образом мы можем самостоятельно переопределить любой параметр темы в приложении.
Последовательность применения тем и стилей ко View-компоненту
Главный приоритет имеет файл разметки. Если в нем определен параметр, то далее все аналогичные параметры будут игнорироваться.
Следующий приоритет имеет стиль View:
Далее используются предопределенные стили для компонента:
Если параметры не были найдены, то используются атрибуты темы:
В общем-то это все, что нужно знать для того чтобы начать работу с темами. Теперь кратко посмотрим на обновленную дизайн-библиотеку Material Components.
Эпилог
Как видите, Андроид не такая уж и сложная штука. Надеюсь, после прочтения статьи, вы узнали что-то новое или получили ответ на давно интересовавший вопрос.
А если мы хотим все делать самостоятельно?
Как бы не было просто использовать принудительную темную тему, этот режим лишен гибкости. Фактически, все работает по заранее определенным правилам, которые могут не устраивать нас и, что более важно, заказчика. Думаю, что такое решение можно рассматривать как временное, до тех пор пока мы не сделаем свою реализацию темной темы.
В API 8 (Froyo) был добавлен квалификатор -night , который и по сей день используется для применения темной темы. Он позволяет автоматически применять нужную тему в зависимости от времени суток.
В темах DayNight уже используется такая реализация, нам достаточно отнаследоваться от них.
Давайте попробуем написать свою:
В обычном ресурсе для темы ( values/themes.xml ) мы наследуемся от светлой темы, в "ночном" ( values-night/themes.xml ) ресурсе наследуемся от темной темы.
На этом все. Мы получили библиотечную реализацию темной темы. Теперь нам следует поддерживать ресурсы для двух тем.
Чтобы переключаться между темами во время работы приложения можно воспользоваться AppCompatDelegate.setDefaultNightMode , который принимает следующие параметры:
- MODE_NIGHT_NO — Светлая тема;
- MODE_NIGHT_YES — Темная тема;
- MODE_NIGHT_AUTO_BATTERY — Автоматический режим. Включается темная тема, если активен режим энергосбережения;
- MODE_NIGHT_FOLLOW_SYSTEM — Режим на основе системных настроек.
Что там по темной теме?
Совсем скоро состоится релиз Android Q, а вместе с ним к нам придет и официальная темная тема.
Пожалуй, одна из самых интересных и эффектных возможностей новой версии Android — это автоматическое применение темной темы для всего приложения одной строчкой кода.
Звучит здорово, давайте пробовать. Предлагаю взять всеми любимый гитлаб клиент от terrakok.
Разрешаем перекрашивать приложение (по умолчанию запрещено):
Атрибут android:forceDarkAllowed доступен с API 29 (Android Q).
Запускаем, смотрим что получилось:
Согласитесь, что для одной строчки кода выглядит очень круто.
Конечно, есть проблемы — BottomNavigationBar сливается с фоном, лоадер остался белым, выделение кода страдает и, вроде бы, все, по крайне мере мне больше ничего серьезного в глаза не бросилось.
Уверен, что потратив не так много времени, можно решить основные проблемы. Например, отключив автоматический темный режим для отдельных вьюшек (да, так тоже можно — android:forceDarkAllowed доступен для View в файле-разметке).
Следует помнить, что данный режим доступен только для светлых тем, если вы используете темную, то принудительная темная тема работать не будет.
Рекомендации по работе можно почитать в документации и на material.io.
Читайте также: