- Легко переходим на векторный формат картинок вместо нарезки под разные плотности экранов в Android 4.0+. Часть 1 из 2
- Библиотека BetterVectorDrawable
- Подключаем библиотеку
- Включаем перехват ресурсов
- Удобный способ
- Быстрый способ
- Ручной способ
- Используем vector drawable
- OutOfMemory и использование векторных изображений в Android Studio
- 1. Используйте векторные изображения вместо растровых
- 2. Увеличьте размер «кучи»
- 3. Избегайте утечек памяти
- 4. Избегайте больших покадровых анимаций
- Русские Блоги
- Извилистый путь Android Vector к совместимости
- Извилистый путь Android Vector к совместимости
- Vector Drawable
- Как получить векторное изображение
- концепция
- Введение в векторную грамматику
- Из PNG в SVG
- Используйте Android Studio
- Путь Google к совместимости
- Совместимо только с L +
- Совместим с плагином Gradle 1.5
- Совместимость AppCompat23.2
- Статическое векторное изображение
- совместимость с версией pre-L
- Векторное изображение
- Использование в элементах управления
- ImageView\ImageButton
- Button
- RadioButton
- Основы динамического вектора
- Целевое изображение
- Эффект анимации
- Использовать в коде
- Проблемы совместимости с динамическим вектором
- Проблемы обратной совместимости
- Проблемы обратной совместимости
- Извлечь проблемы совместимости строк
- Другие проблемы совместимости
- Расширенный динамический вектор
- Хорошо используйте ObjectAnimator
- Понимание морфинга пути
- Вектор обучения
- Проблемы с производительностью вектора
Легко переходим на векторный формат картинок вместо нарезки под разные плотности экранов в Android 4.0+. Часть 1 из 2
Обычно дизайн приложения рисуется в векторном редакторе (например, Sketch), но типичным форматом картинок в приложении под Android является растровый (как правило, PNG). При разработке приложения необходимо для каждого векторного изображения заниматься утомительной работой по изготовлению набора растровых картинок для разных плотностей экранов. Количество таких комплектов может доходить до шести по числу возможных плотностей: ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi (плотность xxxhdpi необходима только для иконки приложения). При верстке иногда приходится задать в разметке явные размеры для изображения, что может потребовать перемасштабирования растровой картинки, а это, в свою очередь, наверняка приведет к появлению артефактов. К тому же наличие нескольких комплектов картинок отрицательно сказывается на размере выходного apk.
Все решают эти проблемы по-разному: кто-то пытается подключить SVG-библиотеку к проекту, кто-то генерирует нарезку с помощью утилиты.
Как мне кажется, наиболее правильным решением является отказ от использования растровой графики в приложении в пользу векторной. При этом хотелось бы по максимуму задействовать системные возможности. В Android 5.0 появился VectorDrawable – поддержка векторного формата для картинок, которые размещаются в виде ресурсов с расширением xml в папке drawable. На такие картинки можно ссылаться обычным образом из XML-разметки.
Использование VectorDrawable было бы отличным решением, если бы не необходимость поддержки устройств с Android 4.0+, коих большинство. VectorDrawable нет в support library и неизвестно, когда он там появится (хотя начало положено). Но не стоит печалиться: есть замечательная библиотека BetterVectorDrawable с открытым исходным кодом и лицензией Apache 2.0, которая фактически переносит VectorDrawable на Android 4.0+, предоставляя тот же интерфейс, и позволяет при необходимости использовать системный VectorDrawable на Android 5.0+. Нужно отметить, что есть еще пара аналогичных библиотек, но они не стоят Вашего внимания, поскольку не дают полноценно ссылаться на vector drawable ресурсы из разметки.
К сожалению, разработчики Android не предусмотрели поддержку в VectorDrawable градиентов, текстур, масок. Это небольшая проблема, но об этом следует помнить при составлении дизайна приложения. Если от этих элементов невозможно отказаться, то можно как прежде использовать в отдельных местах растровую графику / shape drawable, преимущественно перейдя на вектор.
Итак, чтобы перейти на векторный формат картинок в приложении надо:
- Подключить к приложению библиотеку BetterVectorDrawable
- Выгрузить из векторного редактора изображения в SVG-формате
- С помощью конвертера сконвертировать их все сразу в XML-формат vector drawable
- Положить полученные файлы в директорию приложения res/drawable
- Использовать векторные изображения в разметке и в коде как обычные ресурсы
- Profit
Библиотека BetterVectorDrawable
Подключаем библиотеку
Чтобы подключить библиотеку к приложению достаточно добавить одну строчку в секции dependencies файла build.gradle, расположенном в директории модуля приложения:
Библиотека распространяется через репозиторий JCenter, который используется по умолчанию в новых проектах Android Studio.
Если Вы создавали проект давно, то, возможно, у Вас используется репозиторий Maven Central. Чтобы это проверить, надо в файлах build.gradle поискать вхождения строки
и добавь рядом с ней
Включаем перехват ресурсов
Библиотеке необходимо передать список идентификаторов векторных ресурсов, чтобы она понимала, какие из них являются vector drawable. BetterVectorDrawable будет перехватывать обращения к ним и создавать экземпляры VectorDrawable .
Поскольку передать список нужно один раз, лучше всего это сделать в методе onCreate() класса Application , для чего придется создать его наследника:
И указать этого наследника в манифесте приложения:
Существует три способа передать список: удобный, быстрый и ручной.
Удобный способ
Метод findAllVectorResourceIdsSlow сканирует все drawable XML-ресурсы и убеждается, что каждый возвращаемый ресурс является vector drawable. Разработчики советуют использовать этот метод по умолчанию, тем не менее, это наименее производительный способ, т.е. на старых устройствах время запуска приложения может существенно возрасти.
На Google Nexus 5 в приложении с 400 векторными ресурсами findAllVectorResourceIdsSlow отрабатывает менее чем за 150 мс.
Быстрый способ
Метод findVectorResourceIdsByConvention подразумевает, что названия всех векторных ресурсов начинаются на vector_ или заканчиваются на _vector. Соглашение по именованию нужно указать с помощью параметра resourceNamingConvention .
На Google Nexus 5 в приложении с 400 векторными ресурсами findVectorResourceIdsByConvention отрабатывает менее чем за 20 мс.
Ручной способ
Просто передается список всех идентификаторов векторных картинок. 0 мс.
Используем vector drawable
Или из разметки:
Как видите, все просто.
Если у Вас возникли вопросы, то можно задать их мне либо посмотреть демо-приложение. О проблемах с библиотекой лучше сообщать разработчикам в GitHub.
В следующей части мы обсудим конвертацию изображений из SVG в vector drawable XML.
Источник
OutOfMemory и использование векторных изображений в Android Studio
1. Используйте векторные изображения вместо растровых
Конечно, большие изображения с множеством мелких деталей не стоит переводить в вектор — это займёт столько же места, как и растр, если не больше. Однако мелкие изображения, вроде иконок и остальных деталей пользовательского интерфейса следует конвертировать в вектор в целях экономии памяти. Да и работать с векторными изображениями зачастую гораздо удобнее. А теперь, самое главное — как это сделать?
- Открываем Android Studio.
- Кликаем правой кнопкой мыши по папке drawable или её содержимому > New > Vector Asset
Указываем путь к своему svg-файлу. Если ваше изображение имеет неправильную форму, то советую поставить галочку рядом с параметром Override — в противном случае картинка будет подогнана под стандартные размеры, что может исказить её пропорции.
Для конвертации из растра в вектор могу посоветовать отличное бесплатное приложение Inkscape. Немного о работе с ним:
- Открываем Inkscape.
- Перетаскиваем в него любой растр. В открывшемся окне выбираем параметры импорта и жмём ОК.
- В верхнем тулбаре, предварительно выбрав наше изображение, выбираем Контур > Векторизировать растр (Shift + Alt + B).
- Теперь самое главное. В новом окне ставим галочку рядом с «Убрать фон» и выбираем следующее: будет ли наше изображение цветным, и сколько нужно сделать сканирований. Нельзя забывать, что от этих двух параметров напрямую зависит размер нашего векторного файла.
Больше сканирований — больше цветов, оттенков и деталей. Моему лепрекону, чтобы приобрести божеский вид, по причине большего количество цветов в изображении понадобилось 30 сканирований. Это довольно много, лучше делать не больше десяти и выбирать картинки попроще.
Теперь проведём небольшой тест, доказывающий преимущество вектора в экономии памяти.
Я создал новый проект с одним-единственным ImageView, к которому применил анимацию, перемещающую его из точки А в точку Б, поочерёдно изменив изображения на растровое и векторное. Смотрим данные.
Разница почти что в два раза. Думаю, это достаточно убедительно.
2. Увеличьте размер «кучи»
Для этого перейдите в манифест вашего проекта (app > manifests > AndroidManifest.xml) и в колонке application добавьте строку:
По сути, увеличение «кучи» — это не решение проблемы OutOfMemory, а её задвигание на дальнюю полку. Вместо того, чтобы оптимизировать использование приложением памяти устройства, мы даём ему больше места. Не стоит забывать и то, что у каждого устройства свой объём памяти, как основной, так и дополнительной, выделяемой под приложение.
3. Избегайте утечек памяти
Любое приложение в своей работе использует множество объектов, которые, естественно, занимают определённое место в памяти. В идеале, сборщик мусора должен удалять из неё неиспользуемые объекты, но иногда появляются так называемые «утечки памяти», которые вызывают серьёзные проблемы в работе приложения. Существуют различные причины утечек памяти, о которых подробно рассказано тут.
От себя хотел бы посоветовать библиотеку WeakHandler, разработанной компанией Badoo, и призванной устранить утечки памяти, связанные с неправильным использованием android.os.Handler. Для использования данной библиотеки добавьте в свой gradle-файл (Gradle Scripts > build.gradle (Module:app)) в колонку dependencies строку:
И не забудьте импортировать сам WeakHandler, если студия не сделала это автоматически.
4. Избегайте больших покадровых анимаций
Покадровая анимация в Android Studio — штука удобная, но далеко не самая экономичная. При использовании в ней большого количества изображений, вы непременно получите OutOfMemory.
Но, если уж вам это очень понадобилось, лучше используйте gif-изображение вместе с библиотекой Android Gif Drawable. Эта библиотека упрощает работу c gif, а также потребляет гораздо меньше памяти, чем покадровые анимации Android Studio. Для использования данной библиотеки добавьте в свой gradle-файл (Gradle Scripts > build.gradle (Module:app)) в колонку dependencies строку:
и в свой второй gradle-файл (Gradle Scripts > build.gradle(Module:«название вашего приложения»)) в колонки buildscript и allproject строку:
Для отключения gif вместо start() пишем stop(). Также не забывайте сжать gif-ки, это сэкономит ещё больше места.
Надеюсь, что моя статья была вам полезна. Спасибо.
Источник
Русские Блоги
Извилистый путь Android Vector к совместимости
Извилистый путь Android Vector к совместимости
Когда я писал книгу два года назад, я изучал Vector, предложенный Android L, но обнаружил, что он полностью несовместим. Я считаю, что это одна из причин, по которой он не получил широкого распространения. После неустанных усилий Google теперь Vector наконец приветствует А вот и весна.
Позже в статье будут представлены демонстрация и визуализация этой статьи с открытым исходным кодом вGithub
Vector Drawable
Когда был выпущен Android 5.0, Google предоставил поддержку Vector. По сравнению с обычным Drawable, Vector Drawable имеет следующие преимущества:
- Векторные изображения могут быть автоматически адаптированы, нет необходимости устанавливать разные изображения по разрешению
- Векторное изображение может значительно уменьшить размер изображения. Одно и то же изображение, если оно реализовано с помощью Vector, может составлять всего несколько десятых размера PNG.
- Простые в использовании, многие инструменты дизайна могут напрямую экспортировать изображения SVG и преобразовывать их в векторные изображения.
- Мощный, вы можете реализовать очень сложную анимацию без написания большого количества кода.
- Зрелый и стабильный интерфейс получил широкое распространение
Когда изображение Vector было впервые выпущено, оно поддерживало только Android 5.0+. Для системы Android pre-L его нельзя было использовать. Следовательно, можно сказать, что Vector в то время был бесполезен. Однако, начиная с AppCompat 23.2, Google также совместим с системой Android p-View, то есть Vector может использоваться во всех системах выше Android 2.1, нужно только указать com.android.support:appcompat-v7:23.2.0 Вышеупомянутая версия хороша, на данный момент Vector следует рассматривать как ее источник.
Как получить векторное изображение
концепция
Прежде всего, необходимо объяснить две концепции — SVG и вектор.
SVG, а именно векторная графика с масштабируемой векторной графикой, этот формат изображения широко используется во внешнем интерфейсе, подробности см. В WIKI:https://en.wikipedia.org/wiki/Scalable_Vector_Graphics
Вектор относится к векторной диаграмме в Android, которая является векторной диаграммой в Android, см.:https://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html
Таким образом, можно сказать, что Vector — это реализация SVG в Android, поскольку Vector в Android не поддерживает весь синтаксис SVG и в этом нет необходимости, потому что полный синтаксис SVG очень сложен, но уже поддерживаемого синтаксиса SVG достаточно. В частности, синтаксис Path — это почти стандартная конфигурация Vector в Android. Подробнее см.http://www.w3.org/TR/SVG/paths.html
Введение в векторную грамматику
Android совместим с SVG в упрощенном виде. Этот способ заключается в использовании его тега Path. С помощью тега Path можно реализовать почти все другие теги в SVG. Хотя это может быть немного сложнее, все это возможно. Это делается с помощью инструментов, поэтому не беспокойтесь о том, что это будет сложно написать.
Анализ инструкций по пути выглядит следующим образом:
- M = moveto (M X, Y): переместить перо в указанную координату
- L = lineto (L X, Y): провести прямую линию до указанной координатной позиции
- H = горизонтальная линия (H X): провести горизонтальную линию в указанном положении координаты X
- V = вертикальная линия (V Y): проведите вертикальную линию до указанной позиции координаты Y
- C = curveto (C X1, Y1, X2, Y2, ENDX, ENDY): кубическая кривая Бессе
- S = smooth curveto(S X2,Y2,ENDX,ENDY)
- Q = квадратичная кривая Бельзера (Q X, Y, ENDX, ENDY): квадратичная кривая Бельзера
- T = гладкая квадратичная кривая Бельзераto (T ENDX, ENDY): отображение
- A = эллиптическая дуга (A RX, RY, XROTATION, FLAG1, FLAG2, X, Y): дуга
- Z = closepath (): закрыть путь
- Ось координат центрируется в точке (0,0), ось X расположена горизонтально вправо, а ось Y — горизонтально вниз.
- Все инструкции в верхнем и нижнем регистре. Абсолютное позиционирование в верхнем регистре относится к глобальной системе координат; относительное позиционирование в нижнем регистре относится к системе координат родительского контейнера
- Пробел между командой и данными можно не указывать.
- Только одну и ту же инструкцию можно использовать несколько раз.
Обратите внимание, что во время обработки «M» перемещалась только кисть, и ничего не рисовалось. Он также может одновременно рисовать прерывистые линии на заднице.
Что касается этих грамматик, разработчикам не нужно разбираться во всем, но нужно понимать их, а все остальное можно реализовать с помощью инструментов.
Из PNG в SVG
Дизайнерам не составляет труда преобразовать часто используемые изображения PNG в изображения SVG, поскольку большинство инструментов дизайна (PS, Illustrator и т. Д.) Поддерживают экспорт изображений в различных форматах, таких как PNG, JPG. Конечно, он также включает в себя SVG.Поэтому дизайнер может проектировать в точности оригинальным способом, но при окончательном экспорте выберите SVG.
Разработчикам не обязательно учиться использовать эти инструменты дизайна. Разработчики могут использовать некоторые инструменты для самостоятельного преобразования некоторых базовых изображений.http://inloop.github.io/svg2android/ Это такой замечательный веб-сайт, который может конвертировать обычные изображения в Android Vector Drawable онлайн. как показано на картинке:
Или вы также можете использовать редактор SVG для написания изображений SVG, напримерhttp://editor.method.ac/
Используйте Android Studio
Используя Vector Asset в Android Studio, вы можете легко создавать векторные изображения и даже создавать векторные изображения непосредственно из локальных SVG-изображений, как показано на рисунке:
После ввода вы можете сгенерировать векторное изображение, как показано на рисунке:
Путь Google к совместимости
Совместимо только с L +
Вектор — это новая концепция, предложенная в Android L, поэтому вначале она была совместима только с L +.
Совместим с плагином Gradle 1.5
Начиная с Gradle Plugin 1.5, Google поддерживает совместимый метод, то есть на Android L используйте Vector, а в L используйте Gradle для создания изображений PNG из Vector.
После выпуска Android gradle plugin 1.5 была добавлена новая функция, связанная с VectorDrawable. Инструменты сборки Android предоставляют другое решение для обеспечения совместимости. Если скомпилированная версия является версией до 5.0, то инструменты сборки будут генерировать соответствующее изображение PNG из VectorDrawable, так что версия ниже 5.0 использует сгенерированное изображение PNG. , А VectorDrawable используется в версиях выше 5.0. Добавьте конфигурацию generatedDensities в build.gradle, чтобы настроить плотность сгенерированного изображения PNG.
Совместимость AppCompat23.2
Начиная с AppCompat23.2, Google начал поддерживать использование Vector в более ранних версиях.
Статическое векторное изображение
У нас есть много способов получить эти векторы, поэтому, как их использовать, использование Android 5.0 и более поздних версий не рассматривается, это не очень репрезентативно, мы начинаем с совместимости с версией до L.
совместимость с версией pre-L
VectorDrawableCompat полагается на некоторые функции AAPT, которые могут сохранять добавленные идентификаторы атрибутов, используемые последней векторной графикой, чтобы на них можно было ссылаться в версии до L.
Для использования Vector до Android 5.0 требуется aapt для обработки некоторых ресурсов. Этот процесс можно задать в конфигурации aapt. Если такой флаг не включен, android.content будет появляться при работе на устройствах ниже 5.0. res.Resources $ NotFoundException.
Во-первых, вам нужно добавить поддержку совместимости с векторами в скрипт build.gradle проекта. Код выглядит следующим образом:
Используйте плагин Gradle 2.0 или выше:
Используйте Gradle Plugin 2.0 или ниже, Gradle Plugin 1.5 или более:
Как упоминалось ранее, этот метод совместимости фактически закрывает компромисс AAPT с использованием Vector для версии до L, то есть для версии L и выше используйте Vector, а для версии до L используйте Gradle для создания соответствующего изображения PNG. , Массив generatedDensities на самом деле представляет собой массив разрешений изображений PNG, которые необходимо сгенерировать. Это не требуется после использования appcompat.
Конечно, самое главное — добавить поддержку appcompat:
В то же время убедитесь, что вы используете AppCompatActivity вместо обычного Activity.
Векторное изображение
Базовое векторное изображение на самом деле является файлом xml, как показано ниже:
Отобразите как показано:
Здесь нужно объяснить несколько тегов:
- android: width \ android: height: определяет ширину и высоту изображения
- android: viewportHeight \ android: viewportWidth: определяет масштаб разделяемого изображения, например 500 в этом примере, то есть изображение размером 200 dp разделено на 500 частей, а координаты в теге Path позади, все здесь используют координаты после деления система.
Это дает очень хороший эффект, заключающийся в отделении размера изображения от изображения, а затем вы можете изменять размер изображения по своему желанию, не изменяя координаты в PathData.
- Эти атрибуты в android: fillColor: PathData не будут подробно обсуждаться и в основном аналогичны атрибутам рисования Canvas.
Использование в элементах управления
Со статическим векторным изображением его можно использовать в элементе управления.
Можно обнаружить, что мы используем здесь обычный ImageView, который, похоже, не является AppcomatImageView, потому что после использования Appcomat система автоматически преобразует ImageView в AppcomatImageView.
ImageView\ImageButton
Для таких элементов управления, как ImageView, чтобы быть совместимыми с векторными изображениями, вам нужно только заменить предыдущий атрибут android: src на app: srcCompat. Пример кода выглядит следующим образом:
Если задано в коде, код будет следующим:
setBackgroundResource также является API, который может устанавливать Vector
Button
Button не может напрямую использовать app: srcCompat для использования векторного изображения, его нужно использовать через Selector. Сначала создайте два изображения для двух состояний Selector. Код выглядит следующим образом:
Очень просто, просто замените изображение в обычном селекторе на векторное изображение. Затем используйте этот селектор в кнопке:
Тогда запускайте. Если думаете, что он может работать, это слишком наивно. Все говорили, что он совместим. Как тут может быть ямы? Вот яма .
Эта яма на самом деле имеет историческое происхождение. Разработчик Google написал в своем блоге:
First up, this functionality was originally released in 23.2.0, but then we found some memory usage and Configuration updating issues so we it removed in 23.3.0. In 23.4.0 (technically a fix release) we’ve re-added the same functionality but behind a flag which you need to manually enable.
Фактически, их изменение затрагивает такие классы, как DrawableContainers (DrawableContainers, которые ссылаются на другие ресурсы drawables, которые содержат только векторный ресурс), типичным примером которых является Selector (также StateListDrawable). Флаг, упомянутый разработчиком в статье, представляет собой следующий код, который можно разместить перед Activity:
После включения этого флага вы можете нормально использовать DrawableContainers, например Selector. В то же время вы также включаете разрешение на использование составных чертежей, таких как android: drawableLeft, разрешение на использование RadioButton и атрибут src ImageView.
RadioButton
Кнопка RadioButton также может быть определена, код выглядит следующим образом:
Основы динамического вектора
Динамический вектор — это суть Android Vector Drawable
Динамический вектор должен быть реализован с помощью тега animated-vector. Он похож на клей, который склеивает элемент управления и векторное изображение. Базовый код анимированного вектора выглядит следующим образом:
Фактически, есть только два важных момента, на которые нужно обратить внимание: XXXXX1 и XXXXX2. Конкретный пример показан ниже:
Здесь это означает, что целевое изображение доступно для рисования / ic_arrow, а анимации anim_left и anim_right используются для левого и правого соответственно. Атрибут name здесь является атрибутом имени группы или тега пути в статическом векторном изображении.
Тег animated-vector фактически сообщает об ошибке в текущей Android Studio, но это не влияет на компиляцию и запуск.Это ошибка Android Studio.
Целевое изображение
XXXXX1 — это целевое векторное изображение, которое является статическим векторным изображением, например:
Можно обнаружить, что у векторного изображения здесь на один групповой тег больше, чем у того, что мы видели раньше. Групповой тег выполняет две функции:
- Сгруппируйте Путь. Поскольку нам нужно будет анимировать Путь позже, мы можем создать Путь с тем же эффектом анимации в той же Группе.
- Чтобы расширить эффект анимации, один тег пути не имеет атрибутов translateX и translateY, поэтому анимация атрибутов не может использоваться для управления translateY пути, а тег группы присутствует, поэтому нам нужно обернуть связанные элементы тега пути в каждый тег группы. в.
Эффект анимации
XXXXX2 — это фактически анимация, которая будет реализована шаблоном, а эффект анимации — это фактически анимация основного атрибута, например:
Использовать в коде
Проблемы совместимости с динамическим вектором
Проблемы обратной совместимости
Когда дело доходит до совместимости, вы должны упомянуть ямы. Почти все изменения, внесенные для совместимости, оставляют некоторые ямы, которые невозможно заполнить. Динамическая векторная анимация не является исключением, хотя Google использовал Android 2.1 или выше для векторных изображений. Совместима, но есть еще много ограничений для динамической векторной анимации, например:
- Path Morphing, анимация преобразования пути, не может использоваться в версии Android до L.
- Интерполяция пути, интерполятор пути, может использовать системный интерполятор только в версии Android до L и не может быть настроена.
- Анимация пути, то есть анимация пути, обычно заменяется кривыми Безье, поэтому особого воздействия не наблюдается.
Проблемы обратной совместимости
В дополнение к проблемам совместимости в более низких версиях, есть также проблемы совместимости над L-версией, то есть интерфейс AppCompatActivity наследуется. Если srcCompat ImageView установлен напрямую, анимация Path Morphing не может вступить в силу, потому что AppCompatActivity по умолчанию уже используется по умолчанию Используйте ImageViewCompat для преобразования, но AnimatedVectorDrawableCompat не поддерживает анимацию Path Morphing, поэтому она недопустима в интерфейсе AppCompatActivity.
Решение простое, то есть используйте код для добавления анимации в ImageView:
Будьте осторожны, чтобы не использовать AnimatedVectorDrawableCompat.
Извлечь проблемы совместимости строк
Иногда разработчики помещают pathData из векторного изображения в string.xml для краткости кода, а затем ссылаются на строку в векторном изображении.
Однако, если этот метод совместим с моделями ниже 5.0 за счет создания png, будет сообщено об ошибке pathData. Компилятор не будет читать string.xml и может только записать pathData в векторное изображение. То же самое верно и для файла анимации. Жертва совместимости неизвестна.
Другие проблемы совместимости
Другие очень странные, странные и непонятные проблемы совместимости могут быть решены только с помощью папок версий, таких как drawable-v21 и drawable. Создайте два ресурса с одинаковым именем файла в двух папках соответственно, чтобы В версии 21 и выше будут использоваться ресурсы drawable-v21, в то время как другие будут использовать ресурсы drawable.
Расширенный динамический вектор
Хорошо используйте ObjectAnimator
Так называемая расширенная векторная анимация фактически использует некоторые свойства ObjectAnimator, особенно trimPathStart и trimPathEnd для вектора (обратите внимание, что свойство pathData несовместимо с pre-L).
Официальная документация для этих двух атрибутов выглядит следующим образом:
На самом деле, это очень просто. Это перехват изображения. Просто установите масштаб, то есть какая часть изображения рисуется в данный момент, а остальное не прорисовывается. Начало и конец рассчитываются на основе данных начала и конца пути соответственно. Вы можете сослаться на несколько примеров. Понятно.
Понимание морфинга пути
Анимация Path Morph — это продвинутое использование векторной анимации. В конечном итоге это преобразование двух PathData, но это преобразование не является произвольным. Для двух PathData они могут выполнять Path Morph при условии, что они имеют одинаковые номера. Ключевой момент, то есть преобразование двух путей, — это просто изменение координат ключевой точки.После усвоения этого базового принципа очень легко реализовать Path Morph.
Вектор обучения
Я открыл исходный код демонстрационной библиотеки векторной анимации на Github, адрес следующий:
Эта демонстрация разделена на две части: одна часть совместима с версией Android pre-L и векторной анимацией версии L +, другая часть (переключается кнопкой на панели действий) совместима только с анимацией L + Vector.
Каждая векторная анимация в основном состоит из четырех частей, а именно:
- Вектор: ресурс изображения
- Animated-vector: Анимация, связыватель изображений
- ObjectAnimator: Анимационные ресурсы
- Код: запуск анимации
Каждая векторная анимация анализируется через эти четыре части, и это очень понятно.
Вот рендеринг демонстрации:
Проблемы с производительностью вектора
Некоторые читатели оставили сообщение в конце статьи с вопросом о производительности VectorDrawable Вот объяснение.
- Эффективность рисования растрового изображения не обязательно выше, чем у вектора. У них есть определенный баланс. Когда вектор относительно прост, его эффективность должна быть выше, чем у растрового изображения. Следовательно, чтобы обеспечить высокую эффективность вектора, вектор должен быть проще, а PathData еще больше. Стандартные и оптимизированные. Когда векторные изображения становятся очень сложными, требуется растровое изображение.
- Vector подходит для небольших ICON, таких как ICON, Button, ImageView, или требуемых эффектов анимации. Поскольку Bitmap имеет функцию кеширования в графическом процессоре, а Vector — нет, векторные изображения нельзя часто перерисовывать.
- Когда векторное изображение слишком сложное, следует обращать внимание не только на эффективность рисования, но и на эффективность инициализации, которая также является важным фактором.
- Скорость загрузки SVG будет выше, чем у PNG, но скорость рендеринга будет ниже, чем у PNG. В конце концов, PNG имеет аппаратное ускорение, но в среднем увеличение скорости загрузки компенсирует недостаток скорости рисования.
В этом видео Google объясняется эффективность Vector, вы можете ссылаться на следующее:
Источник