VectorDrawable - доступен ли он как-нибудь для версий Android до Lollipop? [закрыто]


87

Задний план

Я заметил, что Android теперь поддерживает какой-то векторный рисунок через класс под названием « VectorDrawable » (а также AnimatedVectorDrawable , BTW). Я узнал об этом, посмотрев, что нового в Android-Studio .

Интересно , если это будет конец того , чтобы положить несколько файлов в несколько папок ( mdpi, hdpi, xhdpiи т.д.). Это было бы здорово и в некоторых случаях могло бы уменьшить размер приложений.

Вопросы

Я хотел бы задать несколько вопросов об этом новом классе:

  1. Можно ли использовать его в более старых версиях Android, может быть, через библиотеку даже библиотеки поддержки Google?

  2. Я не знаком с тем, как это работает, но может ли Lollipop обрабатывать файлы SVG? Может ли он делать что-нибудь, доступное для файлов SVG?

  3. Есть ли какой-нибудь образец / учебник / видео по его использованию, кроме документации, которую я нашел?


3
Насколько я понимаю, VectorDrawable - это андроидификация файлов SVG. Тем не менее, я использую SVG более года за счет сторонних библиотек . ( android-svg , svg-android и т. д.). Есть одноименные. Каждый из них отличается от других, поэтому выбирайте точно в зависимости от ваших потребностей.
Phantômaxx,

7
Я сделал онлайн-инструмент для преобразования SVG в вектор ресурсов xml (только леденец) - inloop.github.io/svg2android - он еще не так много тестировался в ранней альфа- версии . Он поддерживает простые файлы svg (поскольку Android поддерживает), я протестировал его с помощью inkscape - нарисовал несколько фигур (прямоугольник, круг, спираль ...), выберите все, затем «Путь-> Объект к пути», экспортировал в * .svg и зашел на сайт, сгенерировал xml и отлично работает.
Юрадж

1
@Yuraj Вау, это так круто! отличная работа ! И за такое короткое время ... Вот, возьми мои +1. :)
разработчик android

Что касается inloop.github.io/svg2android ... В s a very usefull tool but Iтаком случае он получил неправильный результат, и я не знаю, что не так ... Хммм, для дальнейшего выпуска я бы хотел, чтобы этот инструмент уведомлял о плохом формате ... Если бы я использовал чистые svg-файлы с 3-сторонними библиотеками, все в порядке ...
Alex Zezekalo

@AlexZezekalo Вы должны написать об этом на его веб-странице Github: github.com/inloop/svg2android
разработчик Android

Ответы:


39

ОБНОВЛЕНИЕ Март 2016 г.

По Library Поддержка Android 23.2.1 обновление, поддержка Векторные и анимированные вводимого коэффициента Вектор вводимого коэффициента. (вы также можете использовать latestone для того же)

Обновите версию библиотеки в файле gradle.

compile 'com.android.support:recyclerview-v7:23.2.1'

Векторные рисунки позволяют заменять несколько ресурсов png одной векторной графикой , определенной в XML. В то время как ранее ограничивается леденец и высокоскоростными устройствами , как VectorDrawableи AnimatedVectorDrawableтеперь доступны с помощью двух новых библиотек поддержки поддержки: support-vector-drawable и animated-vector-drawable. новый app:srcCompatатрибут для ссылки на векторные чертежи.

Проверьте исходный код на github с некоторыми примерами .

Изменения в библиотеке appcompat v7:

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


3
Что касается поддержки векторов, разве недостаточно обновить плагин gradle и использовать "vectorDrawables.useSupportLibrary = true" внутри "defaultConfig"?
разработчик Android

1
да, для подключаемого модуля Gradle 2.0+ и для подключаемого модуля Gradle 1.5 вам нужно добавить -> android {defaultConfig {generatedDensities = []} // Это выполняется за вас с помощью подключаемого модуля Gradle 2.0+ aaptOptions {additionalParameters "--no-version -vectors "}}
Амит Вагела 02

1
Также покажите здесь код. Когда-нибудь ссылка может перестать работать. Вы получите +1 за это усилие :)
разработчик Android

да точно. в ближайшее время опубликует код на git и здесь.
Амит Вагела 02

2
Приведенное compileвыше утверждение подразумевает, что проект использует, RecyclerViewчто не всегда так.
razzledazzle

13

Обновление 2 : они снова включают его в библиотеке поддержки 23.4.0:

Для пользователей AppCompat мы добавили дополнительный API для повторного включения поддержки векторных чертежей из ресурсов (поведение, описанное в 23.2) через AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - имейте в виду, что это все еще может вызвать проблемы с использованием памяти и проблемы с обновлением экземпляров конфигурации, поэтому по умолчанию он отключен.

Проверьте это 23.4.0, доступный сейчас

Обновление : это не работает с версии 23.3.0. Подробности см. Здесь . Прокси-чертежи не работают. app:srcCompatи setImageResource()работать, однако.


Поддержка Vector Drawable доступна в библиотеке поддержки версии 23.2 и выше. Однако, чтобы правильно использовать эти чертежи, на них нужно ссылаться косвенно.

Первым шагом было бы подтолкнуть AppCompatверсию.

compile 'com.android.support:appcompat-v7:23.2.0'

Во-вторых, включите поддержку Vector Drawable. Если вы используете плагин Gradle, 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

В противном случае

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

   aaptOptions {  
     additionalParameters "--no-version-vectors"  
   }  
}

В-третьих , обратитесь к связанному ответу .


да, я видел это. Спасибо за расширенную информацию. Я предполагаю, что для общесистемных вещей (уведомлений, виджетов и т. Д.) Это, конечно, недоступно ...
разработчик Android

Уверен, что это должно работать. С этого момента он в основном ссылается на чертежи. Ты это пробовал? В приведенном здесь примере для вектора, доступного для рисования, устанавливается значение a MenuItem, которое отлично работает.
razzledazzle

Вы уверены, что он будет работать даже для уведомлений и виджетов? Я говорю о том, чтобы он работал на старых версиях Android. Как они могли справиться с векторами для этого? Они не могут использовать библиотеку поддержки, не так ли?
разработчик Android

Весь смысл использования версии библиотеки поддержки состоит в том, чтобы заставить вещи работать в более старых версиях. Как указано в документации, он полностью работает до API 7 и анимированных векторных чертежей из API 11.
razzledazzle

Опять же, это работает внутри приложения, но что, если вы попробуете использовать их снаружи, например, в уведомлениях и виджетах? Я не думаю, что там это сработает, потому что я не думаю, что вы можете заставить другие приложения (пусковые установки) использовать библиотеку поддержки, не говоря уже о панели уведомлений. Ты это пробовал?
разработчик Android

12

Вы можете попробовать эту библиотеку поддержки . Он поддерживает VectorDrawable и AnimatedVectorDrawable, представленные в Lollipop, с полной обратной совместимостью.


Эта библиотека совместима только с уровнем API 14 и выше, тогда как библиотека Mr Vector совместима до 7+.
donturner

@donturner: Я согласен с вашей точкой зрения, но я не думаю, что разработчики все еще разрабатывают приложения для 7 API.
V_J

4
Возможно, не API 7, но определенно API 10 (Gingerbread), поскольку на него приходится 4,1% рынка Android ( developer.android.com/about/dashboards/index.html ).
donturner

8

Чтобы дополнить некоторые ответы здесь: да, вы можете получить поддержку для VectorDrawables до Lollipop , по крайней мере, частичную.

Насколько частичное? Это зависит от обстоятельств - я сделал эту диаграмму, чтобы помочь (действительно для библиотеки поддержки от 23.4.0 до - как минимум - 25.1.0).

VectorDrawable шпаргалка


Действительно, но я думаю, что если вы позволите ему автоматически создавать файлы png, это должно быть безопасно
разработчик Android

1
Разъяснено точно.
Abhijit

Это должен быть принятый ответ. Спасибо.
Джастин Мейнерс

6

К сожалению, на данный момент VectorDrawable и AnimatedVectorDrawable недоступны в библиотеке поддержки. Но чтобы воспользоваться этой функцией в версиях Pre-Lollipop, вы можете использовать неофициальный бэкпорт под названием MrVector.

MrVector доступен в Github и будет поддерживать версии Android 7+.

Из официального Readme

Чтобы добавить зависимость MrVector, добавьте следующую строку в блок зависимостей build.gradle.

compile 'com.telly:mrvector:0.2.0'

Чтобы создать объект для рисования из векторного XML,

Drawable drawable = MrVector.inflate(getResources(), R.drawable.vector_android);

Надеюсь это поможет.


1
Несколько дней назад MrVector устарел в пользу грядущего VectorDrawableCompat, который станет частью библиотеки поддержки.
WindRider

Это действительно круто. Спасибо за информацию.
gnuanu

Да, я не могу дождаться, чтобы дополнить свое приложение какими-нибудь жирными SVG: D
WindRider

1
Не рекомендуется. Вместо этого используйте этот stackoverflow.com/a/30502261/1954675 .
V_J

3

Если вы используете VectorDrawable, Android Studio автоматически сгенерирует соответствующие файлы PNG (на основе ваших файлов XML) для версий Pre-Lollipop.

Обратите внимание, что эти сгенерированные файлы PNG считаются BitmapDrawables вместо VectorDrawables на устройствах с API ниже 21 и поэтому не могут быть анимированы или аналогичны на этих устройствах.

Дополнительные сведения см. В разделе «Обратная совместимость»: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html


Да, недавно вышло. Однако он использует PNG вместо векторов, поэтому, если я изменю размер imageView, который содержит изображение, оно будет пиксельным / размытым.
разработчик Android

Разработчик @android: Вы частично правы. Такое поведение будет иметь место, но это будет то же самое для VectorDrawables. Каждый VectorDrawable имеет ширину и высоту, определенные в его XML (например, vector_drawable.xml). Если для этой ширины / высоты установлено значение 50x50dp, но вы установили размер ImageView на 100x100dp, результат все равно будет размытым, даже если вы используете Android 5.0 (и, следовательно, используете VectorDrawable вместо автоматически созданного BitmapDrawable). Настоящее преимущество VectorDrawable перед обычным Bitmap заключается в том, что он учитывает разрешение экрана и, следовательно, не размывается даже на дисплеях с разрешением 4k.
Mehlyfication

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

Он также генерирует png для анимированных векторных рисунков?
Луи CAD

Нет, в этом случае он не будет создавать PNG. Если вы хотите анимировать векторную графику на устройствах под управлением версии Android до Android 5.0, вы можете попробовать VectorDrawableCompat: developer.android.com/reference/android/support/graphics/…
Mehlyfication

3

Lollipop не может обрабатывать файлы SVG без сторонних библиотек.

Лучшее решение, которое я нашел, - это библиотека BetterVectorDrawable вместе с конвертером SVG в VectorDrawable .

BetterVectorDrawable - это реализация VectorDrawable для Android 4.0+ с настраиваемым откатом на Android 5.0+.

Конвертер SVG в VectorDrawable - это пакетный конвертер изображений SVG в файлы ресурсов Android VectorDrawable XML. Онлайн-версия

Ссылки указывают на файлы readmes, которые предоставляют достаточно информации о том, как использовать библиотеку и конвертер.


2

В настоящее время в библиотеке поддержки нет VectorDrawables.

Funkystein прав - VectorDrawable похож на SVG, только поддерживает функции векторного рисования, которые наиболее востребованы, поэтому Android может сосредоточиться на производительности. pathData, например, имеет тот же формат, что и строка «d» SVG.


Таким образом, это будет актуально только тогда, когда Lollipop станет достаточно популярным, и даже тогда он не будет предоставлять много функций. :(
разработчик android

Знаете ли вы какой-нибудь учебник / образец / видео о новых векторных API?
разработчик Android


1

Хорошая новость в том, что Google выпустила Android Support Library 23.2 Support Vector Drawables и Animated Vector Drawables!

Но спасибо тем, кто портировал эту библиотеку до Google!

Вот где великолепны библиотеки AppCompat, они могут вернуть многие новые функции Android в гораздо более ранние версии. Благодаря недавно реализованному классу VectorDrawable разработчики теперь могут использовать векторные изображения вплоть до API 7 (Android 2.1 Eclair). Анимированные векторы немного более ограничены, начиная с API 11 (Android 3.0 Honeycomb), но он по-прежнему охватывает более 97% устройств, активно используемых сегодня.

Руководство по использованию:

Отсылайте " возраст векторов " от @chrisbanes


1
Ницца! Не могли бы вы поделиться некоторыми примерами / учебниками о том, как использовать API векторов новой библиотеки поддержки?
разработчик Android

Конечно ! уже добавил это в свой список дел на выходных! :)
LOG_TAG

1
Спасибо. Если коротко, тоже напишите сюда.
разработчик Android
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.