Android studio чем отличается drawable от drawable 24

Более новые версии Android Studio и всего лишь два доступных каталога – drawable и drawable-v21

С более старыми версиями Android Studio все доступные папки ведра были созданы по умолчанию (например, drawable-mdpi, drawable-hdpi и т. Д.). В новых версиях Android Studio он предоставляет только drawable и drawable-v21. Почему это?

Есть ли причина, по которой Android (в своей бесконечной мудрости) больше не дает вам отдельные папки в ведрах?

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

Спасибо всем, кто пытался помочь, помогли мне достичь окончательного ответа, но ни одно решение не было совершенно правильным. @ User3137702, вероятно, был самым близким, так как он связан со всем движением к векторам / SVG. Я не мог найти окончательного ответа, как что-то прямо из Google (хотя я думаю, что это там), но из того, что я собрал из кучи статей, вероятно, есть причина, по которой они это делают.

Во-первых, похоже, что это началось в Android Studio 1.4. Сейчас я в 1.5. Кажется, что Android движется в направлении, когда вам больше не нужно создавать свои собственные папки плотности (т. Е. Mdpi, hdpi и т. Д.) Для drawables (mipmaps разные, поэтому, пожалуйста, не путайте это с тем, о чем я говорю) , Начиная с Android Studio 1.4, вы будете загружать SVG, которые вы помещаете в обычную папку с рисунком (как в папке v21), конвертировать их в png и размещать в автоматически созданных папках плотности во время последовательности сборки (так что Gradle Делает это для вас, по существу) для всех версий старше API 21. Для 21 и выше SVG поддерживается разными, что является цельной другой темой. Но это существенно упрощает поддержку SVG до API 1!

ОДНАКО, есть БОЛЬШОЙ улов. Это преобразование SVG не всегда так успешно, как вы могли бы надеяться. Он поддерживает только подмножество SVG-файлов, поэтому в зависимости от того, как вы его сохраняете (т.е. какие настройки применяются при сохранении), он может не отображаться должным образом. Даже часто используемые настройки, такие как заполнение градиентом и рисунком, локальные ссылки IRI и преобразования не поддерживаются (пока). Если вы работаете с SVG-файлами, которые вы не сгенерировали, у вас, вероятно, будут проблемы с импортом. Если вы или кто-то, с кем работаете, напрямую генерируете их, вам, возможно, придется поэкспериментировать с тем, как вы сохраняете файлы, и вы должны часто тестировать сборки на более ранних версиях Android, чтобы убедиться, что это получилось так, как ожидалось.

Чтобы импортировать SVG в Android Studio 1.4+, выполните следующие простые шаги:

  1. Щелкните правой кнопкой мыши папку res / drawable
  2. Выберите «Новый»
  3. Выберите «Векторный объект»
  4. На этом этапе вы можете выбрать «Значок материала», который работает очень хорошо, и есть куча красивых «бесплатных» значков, которые вы можете выбрать. Для разработчиков indie, без поддержки дизайна значков, это приятно!
  5. ИЛИ – вы можете выбрать «Local SVG File»
  6. Затем выберите SVG из любой опции с опцией «выбрать». ПРЕДУПРЕЖДЕНИЕ. Это может привести к ошибкам, если SVG, который вы импортируете, не сохраняется должным образом.
  7. Нажмите «Далее»
  8. Убедитесь, что он сохранен в нужном месте, а затем нажмите «Готово»,
  9. На данный момент он ссылается на: android: icon = «@ drawable / ic_imagename» (используя ваше имя изображения вместо ic_imagename, конечно)

@ Ответ CommonsWare был очень полезен для правильного решения, но из того, что я видел, создавая несколько вариантов новых проектов из разных настроек поддержки шаблонов и версий, не было никакого способа фактически создать старые папки плотности , Здесь определенно больше, чем просто выбор шаблона. Но, как он сказал, в зависимости от того, какой шаблон / версия вы выберете, вы можете получить другой набор этих двух типов папок. Но специфический для моего вопроса, Android Studio, похоже, делает акцент на этом новом подходе, не создавая ваши собственные индивидуальные папки с палитрой плотности.

Его довольно круто, imo, но он все еще нуждается в некоторой работе. С практической точки зрения, мне, вероятно, еще нужно будет добавить переносимые папки плотности для поддержки всех изображений, с которыми я работаю, пока этот механизм не будет немного больше поддерживать все типы SVG-рендеринга.

И еще один лакомый кусочек. Поскольку все это обрабатывается через Gradle (фактическое создание папок плотности), вы можете добавить настройки сборки через механизм аромата, чтобы ограничить папки плотности, которые вы хотите создать. Так, если, например, если вы чувствуете, что изображения mdpi достигли своей полезности для вашей конкретной пользовательской базы и хотели бы оставить этот размер / плотность из вашего приложения, чтобы сбрить пару MB с размера приложения, вы можете установить это В аромате сборки Gradle.

В новых версиях Android Studio он предоставляет только drawable и drawable-v21

Это полностью зависит от того, что вы считаете «новыми версиями Android Studio», и тем, какие настройки вы использовали при создании проекта. Например, в Android Studio 1.5.1 я просто создал пару проектов лома, используя мастер создания нового проекта, приняв все значения по умолчанию для одного (результат: minSdkVersion 21) и изменив minSdkVersion второго на 19. Я не drawable-v21 директорию drawable-v21 в любом проекте.

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

Значки запуска были перенесены в mipmap ресурсы.

Векторные чертежи будут -v21/ в каком- -v21/ каталоге -v21/ , а инструменты сборки автоматически генерируют файлы PNG, специфичные для плотности, для более старых устройств. Эти файлы PNG не будут отображаться в src/ в вашем модуле, а скорее в build/ , поскольку они генерируются из вектора, пригодного для ввода и поэтому не считаются частью источника проекта (так же, как файлы классов Java, созданные из Исходный код Java, не является частью источника проекта).

Кроме того, они, по-видимому, пытаются лучше справляться с созданием пустых каталогов в дереве ресурсов. Если шаблон, который вы выбрали, не использует растровые значки, отличные от mipmap, нет никакой причины для создания IDE для создаваемых каталогов. IDE не идеальна в этом – у моих двух проектов лома каждая есть пустой каталог res/drawable/ но они улучшаются.

Читайте также:  Программный эквалайзер для андроид

Источник

Русские Блоги

Подробный Android Drawable

Подробный Android Drawable

@(Technical)[Android, Drawable, StateListDrawable, LayerDrawable, AnimationDrawable]

1. Введение в Drawable

Drawable-может быть просто понято каквводимый коэффициент, Представляя некоторые объекты, которые могут быть нарисованы на холсте. В повседневной работе, когда мы настраиваем фоновые эффекты, картинки, анимацию и другие интерфейсные эффекты для пользовательского интерфейса, нам приходится иметь дело со многими Drawables. Область применения каждого Drawable различна. Мы должны понимать характеристики и использование каждого Drawable, чтобы быть удобными в работе и избегать обходных путей.

Конкретная конфигурация, использование и окончательный эффект интерфейса могут быть найдены в этой статьеприложениеСмотрите внутри. Отношения наследования Drawable в Android следующие: среди них несколько Drawables, отмеченных красными прямоугольниками, являются одними из наиболее часто используемых в нашей разработке:

Более важные методы в Drawable следующие:

Среди них более важный метод inflate с draw 。inflateМетод используется для чтения конфигурации Drawable из XML,drawМетод реализует точное рисование Drawable на Canvas — метод рисования является abstract Абстрактные методы, подклассы должны быть переписаны. раздувать метод в Drawable.createFromXmlInner Называется в:

Мы видим, что при создании Drawable из XML выполняются следующие шаги:

  1. Сначала решите, какой тип Drawable создать на основе имени узла XML, а затем создайте новый соответствующий Drawable;
  2. Затем вызовите метод inflate для Drawable, чтобы позволить ему загрузить конфигурацию, потому что каждый Drawable будет переопределять метод inflate, так что он может быть корректно загружен в различные конфигурации и свойства. Мы поговорим о конфигурации XML позже.

setAlpha Метод используется для установки прозрачности Drawable, setBounds Используется для указания положения и области на холсте при выполнении рисования. Например, если мы настроим вид, в его onDraw Нарисуй один в BitmapDrawable , Мы устанавливаем альфа и границы BitmapDrawable, код выглядит следующим образом:

Производительность после розыгрыша выглядит следующим образом:

На приведенном выше рисунке первая область нарисована нормально, а вторая — мы установили альфа и границы для рисования. Видно, что темно-синяя сплошная цветная часть справа — это размер всего холста. После установки прозрачности альфа 100 Также передается темно-синий цвет сзади, и Bounds определяет размер и положение области на холсте, где рисуется Drawable.

2、ColorDrawable

Далее мы представляем Drawable один за другим, сосредотачиваясь на нескольких обычно используемых Drawables. Поскольку большинство этих Drawables конфигурируются в XML во время разработки, мы представим классы конфигурации XML. Начать с ColorDrawable Во-первых, это должен быть самый простой вид Drawable,Он представлен значением цвета

Например, XML-конфигурация одного из наших ColorDrawable выглядит следующим образом: В качестве корневого узла:

При использовании он похож на другие методы Drawable. Вы можете использовать Resource.getDrawable Чтобы получить или настроить в XML:

Интерфейс этого представления ведет себя так, как вы думаете, он немного синего цвета:

Реализация кода Java:

3、BitmapDrawable

BitmapDrawable к В качестве корневого узла:

Это немного сложнее, мы вводим каждый атрибут один за другим:

  • src:Представляет растровое изображение, на которое ссылается BitmapDrawable, изображение представляет собой png, jpg или gif;
  • antialias:Указывает, открывать ли Сглаживание ;
  • dither:Указывает, отличается ли конфигурация растрового изображения и пикселя экрана, разрешить ли сотрясения , Например, пиксели растрового изображения имеют 32-битный цвет ARGB_8888, а пиксели экрана — RGB_565;
  • filter:Разрешить ли фильтрацию растровых изображений для получения эффекта плавного масштабирования;
  • gravity:Определить растровое изображение gravity , Когда растровое изображение меньше контейнера, этот атрибут указывает растровое изображение в контейнере Положение стыковки с Метод рисования 。
  • tileMode:Когда растровое изображение меньше контейнера, выполните «Плитка» Режим и указать способ укладки кирпича.Это свойство переопределяет свойство гравитации — когда это свойство указано, свойство гравитации не будет работать, даже если оно установлено

из их, gravity с tileMode Эти два атрибута более интересны, мы сосредоточимся на введении. Значение гравитации по умолчанию fill —— То есть, масштабируйте как в горизонтальном, так и в вертикальном направлениях, чтобы изображение могло быть заполнено во весь вид.

Например, у нас есть следующая картина:

Для лучшей презентации режим зажима Обратите внимание, что на этом рисунке мы использовали чередующиеся черные и белые края справа и снизу. Наша конфигурация XML очень проста В качестве корневого узла:

Когда этот BitmapDrawable помещается в контейнер больше, чем он,tileModeЭто сработало:

  1. repeat Режим: изображение будет вставлено несколько раз, пока контейнер не будет заполнен:

  1. clamp Режим: режим зажима, который будет расширять и заполнять оставшиеся позиции в горизонтальном и вертикальном направлениях, используя значения пикселей нижнего и правого краев:

  1. mirror Режим: зеркальный режим, он будет повторять горизонтальное и вертикальное зеркальное отображение, чтобы заполнить оставшиеся позиции:

  1. disabled : Отключить любой метод заливки, весь растровый файл будет использоваться для масштабирования и заливки.

Давайте взглянемgravityАтрибут этого атрибута относительно легко понять:

  1. top Рисовать в горизонтальном центре сверху, другие категории, такие как левый, правый, нижний и верхний, похожи;

Конечно, мы можем использовать «|» для комбинирования для достижения специальных эффектов, например, когда гравитация bottom|right Производительность выглядит следующим образом:

center_horizontal 、 center_vertical Он будет центрирован как в горизонтальном, так и в вертикальном направлениях. Когда четыре значения top / left / right / bottom используются по отдельности, значения в этих двух значениях приводятся по умолчанию: например,top == top|center_horizontal

fill_horizontal 、 fill_vertical Будет масштабироваться и заполняться как в горизонтальном, так и в вертикальном направлениях, по умолчанию также center_horizontal или center_vertical Из этих двух значений;

Ниже “fill_vertical” Представление:

Ниже “fill_vertical|left” Представление:

  1. clip_horizontal 、 clip_vertical Когда Drawable больше контейнера, он будет разрезан по горизонтали и вертикали. “clip_vertical” Видно, что голова и хвост машины обрезаны:

В реальном развитии мы хотим использовать эти значения гравитации, которые могут быть переданы “|” Чтобы получить все желаемые эффекты.

Реализация кода Java:

4、NinePatchDrawable

4.1, .9.png Картинные ресурсы

Это относительно высокого класса Drawable. На самом деле, это наклейка Nine Palace — этот Drawable вписывается в Android “.9.png” файл. Характеристики этого ресурса изображения:
1. Вокруг обычного png-изображения один пиксель вытянут наружу;
2. С этими расширенными пикселями вы можете обводить штрих, чтобы указать Масштабируемая площадь с Область заполнения контента

4.1.1, .9.png зона расширения

Например, теперь у нас есть изображение .9.png следующим образом:

Мы видели вокругОдин пиксель черная точкаЭти черные точки образуются вокруг Четыре стороны , Четыре закругленных угла прозрачны. Затем две левые и верхние стороны указывают, когда кнопка увеличивается. Масштабируемая площадь , Например, область внутри прямоугольника, заключенная в красную рамку ниже, является масштабируемой областью. Область за пределами этой области сохраняет исходное соотношение пикселей при масштабировании.

Читайте также:  Wifi звонки tele2 android

Например, кнопка, растянутая под всеми углами, может сохранять закругленные углысочныйБез наложения или размазывания. Наш файл макета выглядит следующим образом:

Когда btn_normal является файлом .9.png, интерфейс ведет себя следующим образом:

Но если изображение, соответствующее нашему фону, не является исходным изображением, отличным от .9.png, то производительность интерфейса немного плохая, очевидно, что закругленные углыстертойИ закругленные углы выглядят странно

4.1.2 、 .9.png область заполнения

Это красота .9.png. Пиксели на правом и нижнем краях этого формата изображения предусматривают область заполнения , То есть отступы при отрисовке контента:

Прямоугольная область, обведенная красной рамкой выше, определяет область для рисования содержимого. Например, когда мы используем изображение выше в качестве фона для кнопки, текст всей кнопки будет, очевидно, сверху:

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

4.1.3 、 .9.png производство

Краткое упоминание о производстве, в каталоге установки AndroidSDK есть папка с инструментами “draw9patch.bat” Файл, запустите летучую мышь и откройте производственный инструмент .9.png соответственно:

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

4.2, XML-конфигурация NinePatchDrawable

Узел XML этого Drawable выражается следующим образом: В качестве корневого узла:

Среди них атрибут dither такой же, как и в предыдущем BitmapDrawable, то есть разрешен ли дизеринг, когда конфигурация пикселей отличается. src более важен, это значение должно указывать на изображение в формате «.9.png», в противном случае — на нижнюю NinePatchDrawable.inflate Когда метод анализируется, он выдаст XmlPullParserException аномальный:

Мы можем видеть это на рисунке выше bitmap.getNinePatchChunk Этот метод получает всю информацию 9-го дома. Если информация не доступна из объекта Bitmap, это означает, что изображение не в формате «.9.png», и выдается исключение.
На самом деле картинка «.9.png» по сути является обычной картинкой png. Например, у нас есть картинка с именем «btn_normal.9.png», которую можно использовать в коде, например так:

4.3 Отображение между изображениями NinePatchDrawable и .9.png

Итак, как Android отображает эту картинку на NinePatchDrawable? Оказалось, что это изображение стало рассматриваться как обычное растровое изображение, и подсказки можно увидеть из метода Resources.getDrawable:

Вызывается в getDrawable loadDrawable В методе loadDrawable есть стратегия кэширования, давайте сначала ее проигнорируем и посмотрим непосредственно на часть загрузки ресурсов:

Видно, что для Drawable типа конфигурации XML используйте loadXmlResourceParse Загрузите и затем используйте Drawable.createFromXml Этот статический метод создан для получения объекта Drawable. Для других типов Drawable используйте сначала openNonAsset Получите объект потока, затем используйте Drawable.createFromResourceStream Этот статический метод создан. Drawable.createFromXml Этот метод в конечном итоге будет вызван Drawable.createFromXmlInner Этот метод уже был введен во введении к Drawable. Мы сосредоточимся на методе Drawable.createFromResourceStream:

В этом методе мы сначала анализируем объект Bitmap из потока — этот объект практически не отличается от всех других типов ресурсов изображения. Разница в том, что называется следующим Bitmap.getNinePatchChunk 、 NinePatch.isNinePatchChunk Эти два метода, через объединенный вызов этих двух методов, могут определить, является ли этот Bitmap подходящим изображением «.9.png». Далее введите drawableFromBitmap :

Наконец, согласно информации девятого дворца np, этот параметр является нулевым, чтобы решить, какой объект создать. Видно, что для изображений в формате «.9.png» в конечном итоге будет создан объект NinePatchDrawable, а для других обычных png, jpg и других изображений будут созданы соответствующие объекты BitmapDrawable. Все ясно с первого взгляда.

Реализация кода Java:

5、StateListDrawable

Этот тип Drawable является почти наиболее часто используемым типом в нашей разработке, почему? Поскольку он контролирует производительность рендеринга в соответствии с рядом состояний, этот ряд состоянийВписывается в различные состояния нашего интерфейса управления, Состояние элементов управления интерфейсом, как правило, такое: получить фокус, потерять фокус, нормальное состояние, нажатое состояние, состояние с возможностью нажатия, состояние без возможности нажатия, выбранное состояние, невыбранное состояние, проверенное состояние, непроверенное состояние, активированное состояние, не Статус активации и др.

StateListDrawable к В качестве корневого узла:

Один selector С несколькими item Каждый элемент представлен 0 или более состояниями и возможностью рисования. При изменении состояния элемента управления он будет сопоставлен в соответствии с текущим состоянием элемента управления, чтобы соответствовать элементу, наиболее подходящему для текущего состояния, а затем использовать этот элемент. Drawable рисовать.
Например, наш селектор для обычной кнопки выглядит следующим образом:

Мы определяем нормальное состояние кнопки и Drawable из нажатого состояния. Метод использования заключается в следующем:

Затем в нормальном состоянии и в нажатом состоянии интерфейс ведет себя следующим образом:

Нормальное состояние

Прессованное состояние

Круто! За исключением того, что красный в нажатом состоянии выглядит немного ослепительно, выглядит неплохо, верно? Фактически, мы можем контролировать цвет текста кнопки в нормальном состоянии и в нажатом состоянии через состояние управления. Мы создаем новый XML, положить res/color В папке, например, с именем btn_text_color.xml:

Наша конфигурация в кнопке выглядит следующим образом, устанавливая android: textColor для управления цветом текста кнопки:

Теперь высвобождается эффект высокой плоской кнопки:

Нормальное состояние

Прессованное состояние

В реальной работе нам может потребоваться установить несколько состояний, которые можно использовать гибко:

Таким образом, первый элемент будет соответствовать толькоНе отключен и в данный момент нажат и не выбран, Все остальные штаты используют второй пункт.

Конечно, не наступая на несколько дыр, как вы можете быть квалифицированным разработчиком?

нота:

Если есть элемент без какого-либо статуса, этот элемент должен быть помещен внизу всего списка элементов. В противном случае все состояния могут быть сопоставлены первому этому элементу, а другие элементы не будут сопоставлены. Поскольку сопоставление является операцией обхода, если обход находит Drawable, соответствующий текущему состоянию, он возвращается напрямую.

Реализация кода Java:

6、ClipDrawable

ClipDrawable Позволяет нам обрезать Drawable и рисовать только обрезанную часть при рисовании. Ключ здесь Drawable.setLevel Метод работает. При настройке эффектов пользовательского интерфейса для некоторых элементов управления, таких как индикатор выполнения, панель управления громкостью и т. Д., Обычно используется ClipDrawable, в противном случае ваш прогресс не будет обновляться на интерфейсе.

ClipDrawable для В качестве корневого узла:

clipOrientation Определяет направление резки, по умолчанию horizontal —— Обозначает горизонтальную резку, а значение силы тяжести аналогично предыдущему введению в сочетании с clipOrientation определяет положение, где происходит резка——По умолчанию осталосьТо есть, когда clipOrientation находится в горизонтальном положении, отсечение происходит справа от области рисования.

Основное рисование мы смотрим на метод ClipDrawable.draw:

Согласно спецификации AndroidSDK, setLevel Значение уровня [0, 10000] В этом интервале. Можно видеть, что при рисовании область обрезки вычисляется в соответствии со значением уровня и силой тяжести, а затем на Canvas выполняется clipRect для достижения эффекта обрезки.

Читайте также:  Progressbar android studio java

Конфигурация XML также очень проста:

Реализация кода Java:

Мы продолжаем LayerDrawable Увидеть ClipDrawable Метод настройки интерфейса пользователя, например индикатор выполнения.

7、LayerDrawable

LayerDrawable Группа Drawables может быть наслоена в порядке, определенном в XML для рисования, и могут быть установлены id, позиция и т. Д. Каждого слоя Drawable. ProgressBar Фоновый вырез этого элемента управления можно настроить с помощью LayerDrawable. LayerDrawable для В качестве корневого узла:

Каждая группа Drawable состоит из Узел настроен, ничья в элементе представляет идентификатор ресурса рисунка, на который ссылается этот слой Drawale, id Атрибут представляет идентификатор этого слоя Drawable, top、left、right、bottom Эти четыре выпуска атрибутов указывают расстояние от каждого направления. Например, простой LayerDrawable выглядит следующим образом:

Затем эффект отрисовки выглядит следующим образом (где серый слой является фоном действия):

Далее мы рассмотрим конфигурацию LayerDrawable в ProgressBar:

Видно, что когда мы настроили, мы присвоили идентификатор каждому элементу отдельно — эти идентификаторы соответствуют каждому статусу прогресса в ProgressBar: background В соответствии с фоном всего ProgressBar, progress Соответствует текущему фону прогресса, и secondaryProgress Фон выполнения, соответствующий SecondProgress (Обычно мы используем его для буферизации прогресса — аналогично буферизации видео Youku.). Кроме того, мы видим, что ClipDrawable используется в комбинации, потому что реализация ProgressBar объединена Drawable.setLevel Чтобы обновить прогресс, как упоминалось ранее, ClipDrawable происходит onDraw На чертеже уровень был обработан соответственно:

Вот метод: LayerDrawable.findDrawableByLayerId , Этот метод может получить Drawable, соответствующий id.

Реализация кода Java:

8、AnimationDrawable

8.1 Использование AnimationDrawable

С помощью AnimationDrawable , Мы можем легко реализовать анимационные эффекты, основанные на серии Drawable кадров. AnimationDrawable предоставляет серию простых и простых в использовании интерфейсов, чтобы помочь нам:

Как правило, мы настраиваем анимацию в XML, и метод ручного написания кода не рекомендуется. AnimationDrawable В качестве корневого узла:

внутри узла списка анимации oneshot Атрибут указывает, воспроизводится ли анимация только один раз. Если это значение равно false, это указывает на циклическое воспроизведение — это значение по умолчанию. Ряд других анимационных эффектов состоит из группы Узел для настройки, в пункте duration Указывает временной интервал между этим кадром и предыдущим кадром в мс. Например, у нас есть простая конфигурация анимации:

Мы можем применить этот эффект анимации к представлению:

Таким образом, мы можем видеть эффект анимации изменения цвета каждые 500 мс в этом представлении. Конечно, это всего лишь демонстрация. Используя AnimationDrawable, мы можем создавать более крутые анимации.

Обычно мы настраиваем AnimationDrawable в XML через Resources.getDrawable Методы, чтобы получить это. Хотя мы не рекомендуем вручную создавать AnimationDrawable в коде, если вам это понадобится однажды?

Реализация кода Java:

8.2 Принцип анимации рисования

Мы просто встраиваем AnimationDrawable в фон представления, так как эти преобразования анимации реагируют на представление? Оказывается, все это Drawable.Callback Этот обратный вызов работает:

Мы проходим Drawable.setCallback Давайте установим один Callback В этом обратном вызове есть три метода:

  • invalidateDrawable:Перерисовывается;
  • scheduleDrawable:После того, как мс, указанный когда, выполнить то, что Runnable ; (Ключ к анимации можно увидеть здесь)
  • unscheduleDrawable:Асинхронно выполнять что; используется для завершения анимации и т. Д.

Класс View реализует интерфейс Drawable.Callback Прежде чем позвонить View.setBackground Когда метод устанавливает фон для представления, он подключает этот вид в Drawable как обратный вызов:

И реализовано в AnimationDrawable Runnable Этот интерфейс, в run В методе, вызывая AnimationDrawable.nextFrame Метод, который обеспечиваетПереключение анимационного кадраРешение о прекращенииИ другие операции.

Используйте сначала здесь selectDrawable Выберите Drawable соответствующего кадра в качестве активного, а затем scheduleSelf , Позвонив Drawable.Callback.scheduleDrawable Этот метод обратного вызова может достигать эффекта переключения кадров анимации с интервалами.

9. Другие Drawables и резюме

В основном, наиболее часто используемые типы Drawable в нашей работе показаны выше. Иногда используются другие Drawables, что тоже очень интересно. такие как ShapeDrawable 、 RotateDrawable 、 ScaleDrawable а также InsetDrawable , Эти Drawables могут ссылаться на SDK для обучения и гибкого использования, когда они действительно необходимы в работе. Вот краткое введение в функции и методы использования этих Drawables, а также некоторые скриншоты эффектов.

Конфигурируя ShapeDrawable в XML, мы можем легко рисовать прямоугольники, линейные сегменты, скругленные прямоугольники, градиенты и другую графику в качестве фона без вырезания. ShapeDrawable для Как корневой узел, вы должны быть знакомы с дочерними узлами: corners 、 gradient 、 padding 、 size 、 solid 、 stroke И т. Д. Например, ниже приведена простая конфигурация и отображение эффекта:

Мы проходим android:shape Укажите эту форму как прямоугольник ( rectangle ), с дочерними узлами corners Добавьте скругленные углы к прямоугольнику, чтобы сделать его скругленным прямоугольником, затем используйте gradient Дочерние узлы для применения эффекта градиента, используется тип градиента android:type Укажите линейный градиент (linear); последнее использование stroke Дочерний узел добавляет синюю рамку шириной 2dp ко всему графику. Диаграмма эффекта выглядит следующим образом:

RotateDrawable Можно комбинировать с текущим значением уровня Drawable для поворота. Каждый раз, когда значение уровня увеличивается, угол поворота вращается (toDegrees – fromDegrees) / 10000 , Например, следующая картина является нормальной картиной:

Мы вращаемся через XML, где android:fromDegrees с android:toDegrees Определяли начальный угол и конечный угол поворота, android:pivotX 、 android:pivotY Положение центра вращения определяется:

Мы контролируем значение уровня RotateDrawable в потоке пользовательского интерфейса, чтобы получить эффект вращающейся анимации:

Мы перехватили часть процесса анимации следующим образом:

ScaleDrawable Вы можете объединить текущее значение уровня Drawable, чтобы увеличить изображение, также в сочетании Handler с Timer Мы можем получить простую анимацию увеличения.

InsetDrawable Вы можете встроить нарисованный ресурс в другие ресурсы и оставить поля вокруг. Например, нам иногда нужен бланк с 15dp влево и вправо ListView Мы можем использовать InsetDrawable, чтобы сделать разделительную линию. Почему бы не использовать метод выреза, чтобы оставить пустую заметку,Наше требование здесь — 15dp, а не 15pixel. Если вы обрежете картинку, вы можете использовать только единицу пикселя для пробела.

Мы применяем к разделителю ListView:

Таким образом, мы получаем разделитель с пробелом 15dp в начале и конце. Общий эффект интерфейса показан следующим образом (Серый фон — это контур всего ListView):

Конечно, есть и другие, такие как TransitionDrawable 、 LevelListDrawable 、 GradientDrawable 、 PictureDrawable 、 PaintDrawable Не подробно, но обычно они не очень широко используются. После введения некоторых Drawables выше, даже если нам нужно использовать эти типы Drawables в нашей работе, мы можем легко изучить и использовать их, просматривая документы и другие методы.

Источник

Оцените статью