- Русские Блоги
- declare-styleable: настраиваемые атрибуты элемента управления
- title: declare-styleable: настраиваемые атрибуты элемента управления 20180312
- 1. Основное использование
- 2. Введение в типы данных настраиваемых атрибутов:
- Интеллектуальная рекомендация
- Многослойная презентацияViewController Jap
- Распечатать список с конца до головы
- Типы данных и переменные
- Python Daily Practice (4) -идиомы заполняют музыку
- Android. Заметка на будущее
- Layouts
- Attrs
- Dimensions
- Colors
- Русские Блоги
- Подробное объяснение Android Custom View
- Один, пользовательский вид основания
- Во-вторых, процесс рисования View
- Три, пользовательские комбинации элементов управления
- В-четвертых, наследовать системные элементы управления
- Пять, непосредственно наследовать вид
- Шесть, наследовать ViewGroup
Русские Блоги
declare-styleable: настраиваемые атрибуты элемента управления
title: declare-styleable: настраиваемые атрибуты элемента управления 20180312
1. Основное использование
1.1 Определите файл attrs.xml в файле res / values, код выглядит следующим образом:
1.2 Используйте этот атрибут в макете xml следующим образом:
1.3 В пользовательском компоненте вы можете получить значение, определенное в xml, следующим образом:
2. Введение в типы данных настраиваемых атрибутов:
- ссылка: ссылка на идентификатор ресурса в указанной теме.
- Цвет: цвет
- boolean: логическое значение
- измерение: значение измерения
- float: с плавающей точкой
- целое число: целое число
- строка: строка
- фракция: процент
- перечисление: перечисление
- флаг: побитовая операция ИЛИ
- При определении атрибутов можно указать многие типы значений:
Интеллектуальная рекомендация
Многослойная презентацияViewController Jap
. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.
Распечатать список с конца до головы
В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.
Типы данных и переменные
тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.
Python Daily Practice (4) -идиомы заполняют музыку
оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.
Источник
Android. Заметка на будущее
Layouts
Думаю каждый начинающий программист под платформу Android, сразу замечает, чтобы построить какой-либо UI, требуется создать xml файл в директории проекта /res/layout, а потом еще чудесным образом связать его с кодом на Java. По началу это кажется своебразным методом и сразу появлется ощущение того, что чего-то не хватает, и UI дизайнер в плагине Android для IDE далеко не чудо. Ну хватит разглагольствований, к делу!
Если сильно не углубляться в разнообразие устройств на рынке, что в моем случае так и вышло, есть платформа Android какой-то версии, знаем размер экрана целевого устройства. Допустим у вас такая же ситуация.
В общем случае приходиться иметь две папки /res/layout и /res/layout-land. Здесь -land выступает квалификатором (qualifier), который обозначает, что любой layout в этой папке доступен только для Landscape (горизонтального) режима. Если существует layout, который одинакого выглядит для обоих режимов, вертикального и горизонтального, то его помещают в /res/layout. Android самостоятельно вызывает деструктор Activity и создает новое Activity при повороте экрана, если не указана конкретная ориентация в AndroidManifest. Таким образом, можно размещать layout с одним и тем же именем в обоих папках /res/layout и /res/layout-land, а Android позаботится о загрузке актуального layout.
В коде Activity, как обычно, вызывается
Что от меня? И правда, описал в кратце то, что можно и так найти в сети. Дело в том, что мне пришлось писать очень графически измененное приложение. Большенство элементов были очень изменены. Первое что пришло в голову, было ошибочно. Решил написать собственный дочерний компонент, от того же ListView, к примеру, и там понеслось: onDraw, dispatchDraw и др. Так мне показалось мало, еще и вбил конкретные значения в пикселях при отрисовке какого-либо элемента.
Это то, как не надо делать. Даже если нет выхода, пытайтесь до последнего не создавать компонент, а выкручиваться layout’ами. Намного лучше написать BaseAdapter для ListView, к примеру, где загружать другой layout и его контроллировать. Если выхода нет, то все значения для UI в пикселях, выносить в свойства компонента (attrs), которые будет передаваться при описании компонента в xml. Сами значения в xml, так же не указывать на прямую, а использовать dimensions, ссылки.
Давайте рассмотрим, что я подразумиваю под attrs и dimensions.
Attrs
Android предоставляет неявный способ расширять ваши нестандартные компоненты дополнительными свойствами. Потребуется создать attrs.xml файл в /res/values. Вполне вероятно, назвать данный файл можно как угодно по другому, но это название я считаю стандартом.
Содержание attrs.xml вполне доступно для чтение человеком. Давайте рассмотрим простой пример:
Resources встречается постоянно, используется для хранения каких-либо ресурсов и впоследствии доступен в коде Java через статический класс R пакета приложения. К примеру наше объявляение доступно через R.styleable.MyExampleView. По моим наблюдениям и тому, что приходилось использовать, есть такой список format (тип свойства):
- dimension — может быть значение типа 10px, 10dip или ссылка на dimen/[имя значения]
- integer — может быть значение типа 10, 5, 2. Так же думаю, что и ссылка может сработать
- string — просто текстовое значение типа «Hello World» или ссылка на string/[имя значения]
- reference — ссылка на @drawable к примеру, что в свою очередь может быть @drawable, color или что-то другое
Допустим у нас есть собственный класс, наследник View: com.android.example.view.MyExampleView. Опишем его просто:
Таким образом мы создали собственный элемент управления, который можно настраивать прямо из xml, и данный метод очень гибок, т.к. отсутствует привязка к определенным значениям в коде, кроме по умолчанию. Чтобы создать элемент, напишим в layout:
Dimensions
В идеальном мире все значения выносить в /res/values/dimensions.xml в формате: [значение]dp, после чего использовать в xml или коде через ссылку на dimen/[имя]. Я советую, как и поступаю на данный момент, выносить размер текста, главных элементов приложения, к примеру смещения каких-то панелей, padding/margin по умолчанию и др. Не выносить значения для каких-то конкретных элементов, например в одном диалоге кнопка от кнопки на расстоянии в 10 пикселей.
Такой подход поможет быть уверенным, что в приложении весь текст выглядит стандартизированно, например большие заголовки в 30 пикселей, средние в 24, а обычный текст в 16. Если не понравилось — меняем только в одном месте.
В принципе останавливаться на этом долго не стоит, но есть один момент. Недавно Google обновила плагин Android для Eclipse, соответственно, и теперь там есть такой зверь Lint. Так вот, он мне все время подмигивал и убеждал, что надо бы использовать dp, а не px, и расписывал еще по какой такой причине. Я и поверил, сделал. А теперь давайте вспомним о Density. Насколько я понимаю, это значение показывает насколько плотно расположены пиксели друг к другу. Т.е. на пример у вас есть устройство в разрешением в 800×600. Но дело в том, что одно устройство имеет 800 * 600 пикселей, в другое 2 * 800 * 2 * 600. Думаю уловили разницу? Т.е. разрешение одно, но качество и соответственно плотность пикселей совершенно другая. И именно в этом скрывается подвох Lint. После миграции на устройство с большей плотностью, используя dp, у меня все элементы поехали, а текст стал совершенно других размеров (на взгляд).
Как оказалось, используй я с самого начала px везде и игнорируй предупреждения Lint, я бы не тратил дополнительное время на переписывание dp на px.
Colors
Цвета в Android так же могут (должны) быть представлены в xml в форматах: argb, rgb. К примеру, белый цвет:
- rgb = #fff. Это не #0f0f0f или #f0f0f0 — это сокращенная форма, в итоге имеем непрозрачный белый цвет #ffffffff
- argb = #ffff. На подобии предыдущего, только включая alpha составляющую
- rgb = #ffffff. Полная форма rgb
- argb = #ffffffff. Полная форма argb
В принципе очень схоже на dimensions правила, обычно располагается в /res/values/colors.xml, так же в resources теге. Выносить в colors стоит цвета которые используются для стандартизации полного UI, а не каких-либо мелких деталей одного из элементов. Так сказать золотая серидина между параноей и ленью.
Надеюсь кому то эти заметки сохранят время или помогут в чем-то более глубоко разобраться.
UPD:
Спасибо sdfsdhgjkbmnmxc и andreich за указание ошибок в тексте.
Источник
Русские Блоги
Подробное объяснение Android Custom View
Один, пользовательский вид основания
1. Классификация
Есть несколько способов реализовать пользовательский вид:
- Пользовательский комбинированный элемент управления: несколько элементов управления объединены в новый элемент управления, который удобен для многократного использования
- Inherit system View control: наследовать от системных элементов управления, таких как TextView, и расширять основные функции системных элементов управления
- Наследовать представление: не использовать повторно логику управления системой, наследовать представление для определения функции
- Наследовать систему ViewGroup: наследовать от системных элементов управления, таких как LinearLayout, и расширять основные функции системных элементов управления
- Наследовать ViewGroup: не повторно использовать логику управления системой, наследовать ViewGroup для определения функции
2. Просмотр процесса рисования
Рисование View в основном завершается тремя функциями measure (), layout (), draw ()
функция | эффект | Родственные методы |
---|---|---|
measure() | Измерьте ширину и высоту просмотра | measure(),setMeasuredDimension(),onMeasure() |
layout() | Рассчитать положение текущего вида и дополнительного вида | layout(),onLayout(),setFrame() |
draw() | Посмотреть рисунок работы | draw(),onDraw() |
3. Система координат
В системе координат Android верхний левый угол экрана используется как начало координат, начало координат — это положительная ось оси X вправо, а положительная ось оси Y направлена вниз. Следующее:
В дополнение к системе координат Android есть также система координат View. Внутренние отношения системы координат View показаны на рисунке:
Вид получает свою высоту
Высота просмотра может быть рассчитана из приведенного выше изображения:
Исходный код View предоставляет методы getWidth () и getHeight () для получения ширины и высоты View. Внутренние методы такие же, как показано выше, мы можем напрямую вызвать их для получения ширины и высоты View.
Посмотреть собственные координаты
Расстояние от View до его родительского элемента управления можно получить следующим способом.
- getTop (); Получить расстояние от View до верхнего края его родительского макета.
- getLeft (); Получить расстояние от View слева от его родительского макета.
- getBottom (); Получить расстояние от View до нижнего края его родительского макета.
- getRight (); Получить расстояние от View справа от его родительского макета.
4. Конструктор
Унаследуем ли мы системное представление или непосредственно наследуем представление,Все нужно переписать конструктор, есть несколько конструкторов, хотя бы один должен быть переписан, Если мы создадим новый TestView,
5. Пользовательские свойства
Элементы управления системой Android, которые начинаются с android, — это все атрибуты, которые поставляются с системой. Чтобы упростить настройку пользовательских свойств представления, мы также можем настроить значения свойств.
Пользовательские атрибуты Android можно разделить на следующие шаги:
- Настроить вид
- Запишите значения / attrs.xml, напишите в нем стилизованные теги и элементы
- View использует пользовательские атрибуты в файле макета (обратите внимание на пространство имен)
- Получено TypedArray в конструкторе View
Примеры
- Файл декларации для пользовательских атрибутов
- Класс Custom View
- Используется в файлах макета
Тип значения атрибута
(1). Ссылка: ссылка на идентификатор ресурса
- Определение свойства:
- Использование атрибутов:
(2). Цвет: значение цвета
- Определение свойства:
- Использование атрибутов:
(3). Логическое значение: логическое значение
- Определение свойства:
- Использование атрибутов:
(4). Измерение: значение измерения
- Определение свойства:
- Использование атрибутов:
(5). Float: значение с плавающей точкой
- Определение свойства:
- Использование атрибутов:
(6). Integer: целочисленное значение
- Определение свойства:
- Использование атрибутов:
(7). Строка: строка
- Определение свойства:
- Использование атрибутов:
- Определение свойства:
- Использование атрибутов:
(9). Enum: значение перечисления
- Определение свойства:
- Использование атрибутов:
Примечание. Одновременно может использоваться только один из атрибутов типа перечисления, но не android: ориентация = «горизонтальный | вертикальный»
(10). Flag: побитовое ИЛИ операция
- Определение свойства:
- Использование атрибутов:
Примечание. Атрибут типа битовой операции может использовать несколько значений в процессе использования.
(11). Смешанные типы: во время определения атрибута можно указать несколько типов значений
- Определение свойства:
- Использование атрибутов:
Во-вторых, процесс рисования View
В этой главе дается объяснение реализации исходного кода рисования вида, что может помочь нам лучше освоить весь процесс рисования.
Рисование View в основном завершается тремя функциями measure (), layout (), draw ()
функция | эффект | Родственные методы |
---|---|---|
measure() | Измерьте ширину и высоту просмотра | measure(),setMeasuredDimension(),onMeasure() |
layout() | Рассчитать положение текущего вида и дополнительного вида | layout(),onLayout(),setFrame() |
draw() | Посмотреть рисунок работы | draw(),onDraw() |
1、Measure()
MeasureSpec
MeasureSpec — это внутренний класс View, который инкапсулирует размер View. В onMeasure () ширина и высота View будут определяться в соответствии со значением этого MeasureSpec.
Значение MeasureSpec хранится в значении int. Значение int имеет 32 бита, и первые два бита представляют режим, а последние 30 бит представляют размер. Это MeasureSpec = mode + size.
В MeasureSpec есть три режима: НЕУТОЧНО, ТОЧНО и
AT_MOST。
Для View режим и размер MeasureSpec имеют следующие значения:
Режим | значение | соответствовать |
---|---|---|
EXACTLY | Точный режим, View требуется точное значение, это значение Size в MeasureSpec | match_parent |
AT_MOST | В максимальном режиме размер представления имеет максимальное значение, и представление не может превышать значение размера в MeasureSpec. | wrap_content |
UNSPECIFIED | Без ограничений, просмотр не имеет ограничений по размеру, так как размер должен быть | Общая система внутреннего использования |
- Как пользоваться
В View код измерения MeasureSpace выглядит следующим образом:
Здесь следует отметить, что этот код устанавливает только параметр MeasureSpec для дополнительного просмотра, а не фактически устанавливает размер дополнительного просмотра. Окончательный размер дочернего представления должен быть специально установлен в представлении.
Из исходного кода видно, что режим измерения дочернего представления определяется его собственным LayoutParam и MeasureSpec родительского представления.
onMeasure()
Вход всего процесса измерения находится в методе измерения View. Этот метод вызывает метод onMeasure после инициализации некоторых параметров. Здесь мы в основном анализируем onMeasure.
Исходный код метода onMeasure выглядит следующим образом:
Это очень просто: есть только одна строка кода, и мы проанализируем каждый из трех задействованных методов.
- setMeasuredDimension (int measureWidth, int measureHeight): этот метод используется для установки ширины и высоты представления, которое часто используется при настройке представления.
- getDefaultSize (int size, int measureSpec): Этот метод используется для получения ширины и высоты представления по умолчанию в сочетании с исходным кодом.
- getSuggestedMinimumWidth (): принцип getHeight такой же, как у этого метода, здесь анализируется только этот.
Процесс измерения ViewGroup немного отличается от процесса View, он наследуется от View и не переписывает метод измерения и метод onMeasure для View.
Почему вы не переписали на Measure? В дополнение к измерению его ширины и высоты ViewGroup также необходимо измерить размер каждого подэкрана, и разные методы измерения макета также различны (см. LinearLayout и FrameLayout), поэтому не существует способа для равномерной настройки. Следовательно, он предоставляет методы measureChildren () и measureChild () для измерения вложенного представления, чтобы помочь нам измерить вложенное представление.
Исходный код measureChildren () и measureChild () здесь не будет анализироваться. Общий процесс состоит в том, чтобы обойти все дочерние представления, а затем вызвать метод представления view (), чтобы позволить дочернему представлению измерить его размер. Конкретный процесс измерения также был представлен выше
Процесс измерения будет представлять разные формы из-за разных макетов или разных требований. При его использовании вы должны проанализировать его в соответствии с бизнес-сценарием. Если вы хотите продолжить изучение, вы можете взглянуть на метод onMeasure LinearLayout.
2、 Layout()
Чтобы вычислить позицию, мы должны сначала понять систему координат Android. Мы также представили предыдущий контент.
Процесс layout () используется View для вычисления параметров положения View. Для ViewGroup, помимо измерения своей собственной позиции, необходимо также измерить положение дочернего View.
Метод layout () является входом всего процесса Layout (). Взгляните на эту часть исходного кода:
Из исходного кода мы знаем, что в методе layout () положение самого View было установлено методом setOpticalFrame (l, t, r, b) или setFrame (l, t, r, b), поэтому onLayout (change, l , t, r, b) Метод в основном рассчитывает положение дочернего View по ViewGroup.
Желающие могут взглянуть на исходный код onLayout LinearLayout, который может помочь углубить понимание.
3、 Draw()
Процесс рисования — это процесс рисования Представления на экране. Запись всего процесса осуществляется в методе рисования () Представления, и комментарии к исходному коду также четко написаны. Весь процесс можно разделить на 6 шагов.
- При необходимости нарисуйте фон.
- Необходимо было сохранить текущий холст.
- Нарисуйте содержимое просмотра.
- Нарисуй детский вид.
- При необходимости нарисуйте такие эффекты, как края и тени.
- Нарисуйте украшения, такие как полосы прокрутки и так далее.
Затем проанализируйте исходный код каждого шага:
- Не создавайте новые локальные объекты в onDraw. Поскольку метод onDraw может вызываться часто, в одно мгновение будет сгенерировано большое количество временных объектов, что не только отнимает слишком много памяти, но и заставляет систему работать чаще, что снижает эффективность выполнения программы.
- Не выполняйте трудоемких задач в методе onDraw, и при этом вы не можете выполнять тысячи операций цикла. Хотя каждый цикл является легковесным, большое количество циклов все еще занимает много времени ЦП, что приведет к рисованию представления Процесс не гладкий.
Три, пользовательские комбинации элементов управления
Пользовательский комбинированный элемент управления предназначен для объединения нескольких элементов управления в новый элемент управления, который в основном решает проблему многократного использования одного и того же типа макета. Например, HeaderView и dailog наверху, мы можем объединить их в новый элемент управления.
Мы используем пользовательский экземпляр HeaderView для понимания использования пользовательских комбинированных элементов управления.
Макет прост: текст заголовка посередине, кнопка «Назад» слева и кнопка «Добавить» справа.
- Реализовать метод строительства
- Инициализировать интерфейс
- Предоставить внешние методы
Некоторые методы могут быть подвержены влиянию внешнего мира в зависимости от потребностей бизнеса.
- Ссылка на элемент управления в макете
К настоящему времени основные функции уже есть. В дополнение к этим основным функциям, мы также можем сделать некоторые функциональные расширения, такие как настройка элементов, отображаемых моим представлением во время макета, потому что могут быть некоторые требования, которые не требуют правильной кнопки. В настоящее время вам нужно использовать пользовательские атрибуты для решения.
Я кратко представил соответствующие знания о пользовательских атрибутах прежде, давайте посмотрим на код между нами
1. Сначала создайте attrs.xml в каталоге значений
Содержание выглядит следующим образом:
Здесь мы определяем три атрибута, текстовое содержимое, цвет и элементы для отображения.
2. Установите в коде Java
3. Сделайте настройки в файле макета
Хорошо, здесь базовое определение всего представления завершено. Весь код YFHeaderView выглядит следующим образом
В-четвертых, наследовать системные элементы управления
Элементы управления системы наследования можно разделить на унаследованные подклассы View (такие как TextVIew и т. Д.) И наследующие подклассы ViewGroup (такие как LinearLayout и т. Д.). В соответствии с различными бизнес-потребностями способ реализации также будет совершенно другим. Вот относительно простая реализация, которая наследуется от View.
Бизнес-требования: установите фон для текста и добавьте горизонтальную линию в середине макета.
Поскольку эта реализация будет повторно использовать логику системы, в большинстве случаев мы хотим повторно использовать процессы onMeaseur и onLayout системы, поэтому нам нужно только переписать метод onDraw. Реализация очень проста.
Для рисования вида вам также необходимо понять использование Paint (), canvas и Path. Если вам неясно, вы можете немного понять его.
Реализация здесь относительно проста, потому что конкретная реализация будет тесно связана с бизнес-средой, вот только ссылка.
Пять, непосредственно наследовать вид
Прямое наследование View будет более сложным, чем в предыдущей реализации. В сценарии использования этого метода нет необходимости повторно использовать логику системного элемента управления. В дополнение к переписыванию onDraw необходимо переписать метод onMeasure.
Мы используем пользовательский вид для рисования квадрата.
- Сначала определите метод построения и выполните некоторые операции инициализации
- Перепишите метод draw, нарисуйте квадрат, обратите внимание, чтобы установить свойство padding.
Прежде чем мы поговорим о процессе измерения View, давайте посмотрим на исходный код этого шага.
В исходном коде View нет различий между двумя режимами AT_MOST и EXACTLY. То есть, View является абсолютно одинаковым в двух режимах wrap_content и match_parent, которые будут match_parent. Очевидно, это отличается от View, который мы обычно используем, поэтому Мы должны переписать метод onMeasure.
- Переопределить метод onMeasure
Весь пользовательский код View выглядит следующим образом:
Весь процесс примерно такой, есть несколько моментов, которые нужно отметить при непосредственном наследовании View:
1. Обработайте атрибут padding в onDraw.
2. Атрибут wrap_content обрабатывается во время onMeasure.
3. Требуется как минимум один метод построения.
Шесть, наследовать ViewGroup
Процесс настройки ViewGroup является относительно сложным, потому что помимо измерения его собственного размера и положения, он также должен отвечать за параметры измерения в подвиде.
Примеры требований
Реализован скользящий макет, аналогичный Viewpager.
Существует много кодов, и мы объединяем анализ с комментариями.
На этом наш макет просмотра в основном закончен. Но чтобы добиться эффекта Viewpager, вам также необходимо добавить обработку событий. Ранее мы анализировали поток обработки событий, и он часто используется при создании пользовательских представлений.
Эта часть кода больше, чтобы облегчить чтение, комментарии делаются в коде.
После этого в XML-код вводится пользовательское представление
Ну, вы можете бежать, чтобы увидеть эффект.
Источник