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


87

Передумови

Я помітив, що Android зараз підтримує якийсь векторний малюнок за допомогою класу " VectorDrawable " (а також AnimatedVectorDrawable , BTW). Я дізнався про це, подивившись, що нового на Android-Studio .

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

Питання

Я хотів би задати кілька запитань щодо цього нового класу:

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

  2. Я не знайомий з тим, як це працює, але чи може Lollipop обробляти файли SVG? Чи може він зробити щось, що можна досягти у файлах SVG?

  3. Чи є якийсь зразок / підручник / відео його використання, крім документації, яку я знайшов?


3
Наскільки я бачу, VectorDrawable є андроїдизацією SVG-файлів. Однак я використовую SVG s більше року завдяки використанню сторонніх бібліотек . ( 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-сторонніми бібліотеками, все
нормально

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

Відповіді:


39

ОНОВЛЕННЯ БЕРЕЗНЯ 2016

За допомогою оновлення бібліотеки підтримки Android 23.2.1 , підтримка векторних малюнків та анімованих векторних малюнків. (для цього ж можна використовувати латестоун)

Будь ласка, оновіть версію бібліотеки у файлі gradle.

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

Векторні малюнки дозволяють замінити декілька png-ресурсів на одну векторну графіку , визначену в XML. У той час як раніше обмежується льодяник і високошвидкісними пристроями , як VectorDrawableі AnimatedVectorDrawableтепер доступні через два нових підтримки бібліотек підтримки вектор-розтяжною і анімаційного-вектор-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 = []} // Це для вас обробляє плагін 2.0+ Gradle aaptOptions {AdditionalParameters "--no-version -vectors "}}
Аміт Вагела

1
Також, будь ласка, покажіть тут деякий код. Посилання може колись загинути. За ці зусилля ви отримаєте +1 :)
розробник Android

так, звісно. в короткий час розмістить код на git і тут.
Amit Vaghela 02.03.16

2
compileВище твердження означає , що використання проекту , RecyclerViewякий не завжди так.
razzledazzle

13

Оновлення 2 : Вони вмикають його знову в бібліотеці підтримки 23.4.0:

Для користувачів AppCompat ми додали API для повторного ввімкнення підтримки Vector Drawables з ресурсів (поведінка, виявлена ​​в 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 (Пряники), оскільки на це припадає 4,1% ринку Android ( developer.android.com/about/dashboards/index.html ).
donturner

8

Щоб доповнити деякі відповіді тут: так, ви можете отримати підтримку для VectorDrawables до Lollipop , принаймні часткову.

Наскільки частково? Це залежить - я зробив цю діаграму для допомоги (діє для бібліотеки підтримки 23.4.0 - принаймні - 25.1.0).

Шпаргалка VectorDrawable


Дійсно, але я думаю, що якщо ви дозволите йому автоматично генерувати файли png, це повинно бути безпечно
розробник Android

1
Пояснено точно.
Абхіджіт Куране

Це має бути прийнятою відповіддю. Дякую.
Джастін Майнерс

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

Це справді круто. Дякую за інформацію.
гнуану

Так, я не можу дочекатися того, щоб розчарувати свій додаток кількома товстими 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 developer: Ви частково праві. Така поведінка відбуватиметься, але це буде те саме для VectorDrawables. Кожен VectorDrawable має ширину та висоту, визначені в його XML (наприклад, vector_drawable.xml). Якщо для цієї ширини / висоти встановлено значення 50x50dp, але для розміру ImageView встановлено значення 100x100dp, результат все одно буде розмитим, навіть якщо ви використовуєте Android 5.0 (і, отже, використовуєте VectorDrawable замість автоматично згенерованого BitmapDrawable). Справжньою перевагою VectorDrawable у порівнянні зі звичайним растровим зображенням є те, що він враховує екран-dpi з урахуванням і тому не розмивається навіть на 4k-дисплеях.
Меліфікація

Ви маєте на увазі, що VectorDrawable погано відображається при використанні розміру, який для нього не встановлено? Але це векторизований вміст .... Чому б це працювало інакше?
розробник android

Чи генерує він PNG для анімованих векторних малюнків?
Louis 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 Converter - це пакетний перетворювач зображень SVG у файли XML-ресурсів Android VectorDrawable. Інтернет-версія

Посилання вказують на readmes, які надають достатньо інформації про те, як користуватися lib та перетворювачем.


2

Наразі у бібліотеці підтримки немає VectorDrawables.

Funkystein має рацію - VectorDrawable схожий на SVG, підтримуючи лише функції векторного малювання, які користуються найбільшим попитом, щоб андроїд міг зосередитися на продуктивності. pathData, наприклад, має той же формат, що і рядок "d" SVG.


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

Чи знаєте ви якийсь підручник / зразок / відео нових векторних API?
розробник android


1

Чудова новина полягає в тому, що Google випустив бібліотеку підтримки Android 23.2 Підтримка векторних малюнків та анімованих векторних малюнків!

Але подяка людям, які перенесли цю бібліотеку до 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.