Как создать правильные векторные изображения, которые можно использовать в качестве Android Vector-Drawable?

Я новичок в создании векторных изображений. Я начал изучать, как их создавать, потому что мне нужны пользовательские значки для приложения Android, над которым я сейчас работаю. И здесь начинается проблема. Я создаю значки с помощью Inkscape, и когда я пытаюсь преобразовать их в VectorDrawable с помощью Android Studio, он возвращает ошибку о том, что не поддерживает определенные вещи:

ERROR@ line 22 <defs> is not supported
WARNING@ line 139 We don't scale the stroke width!
WARNING@ line 144 We don't scale the stroke width!
WARNING@ line 150 We don't scale the stroke width!
WARNING@ line 156 We don't scale the stroke width!
WARNING@ line 162 We don't scale the stroke width!
WARNING@ line 168 We don't scale the stroke width!
WARNING@ line 174 We don't scale the stroke width!

Сначала я попытался каким-то образом преобразовать путь к объекту в Inkscape, но это не сработало. Затем я искал некоторые решения в Интернете и нашел следующий веб-сайт: http://inloop.github.io/svg2android/ Там я мог преобразовать значок, но теперь я могу использовать его только для Android 7.0 и выше, потому что я использовал атрибут ' правило-заполнения:evenodd'.

Теперь вот мой вопрос: как убедиться, что я использую только правильные атрибуты при создании значка, и как я могу заставить свой значок работать на Android?

Если вы хотите следить за моей попыткой решить проблему, здесь вы можете скачать мой файл SVG: https://dl.dropboxusercontent.com/u/213285061/Foren/Biologie_Icon.svg

Спасибо за каждый совет.

@Scribblemacher Моя проблема не в преобразовании svg в вектор, который можно рисовать, а в том, что я использую «атрибуты svg», которые не поддерживаются Android. Я хотел знать, как избежать использования этих атрибутов или как заменить их поддерживаемыми.
Я все же думаю, что это дубликат. VectorDrawable не является SVG. Если у вас есть SVG, то он должен пройти какое-то преобразование. Эта программа преобразования должна отображать/преобразовывать SVG в VectorDrawable XML. Нужно избегать того, что не поддерживается вашей цепочкой инструментов преобразования, что может привести к десяткам и десяткам вещей (огромный стандарт SVG).
Для решения вашей реальной проблемы я бы предложил попробовать сохранить как «Обычный SVG» в Inkscape, что удалит нестандартный контент, который обычно находится в inkscape:пространстве имен. Возможно, Android Studio сбивается с толку из-за данных пространства имен, используемых Inkscape в формате сохранения по умолчанию.
Спасибо @Scribblemacher, это действительно решило мою проблему. Я не думал, что это будет так легко. По какой-то причине я все еще получаю те же сообщения об ошибках при импорте в Android Studio, но на этот раз это работает. Большое спасибо, я уже несколько часов искал, чтобы исправить это.
рад, что это помогло. Я добавил ответ и некоторые подробности о том, почему это, вероятно, происходит в качестве ответа.
Сохранение как «Обычный SVG» в Inkscape мне не помогло. Вместо этого все работает, если убрать лишнюю группировку объектов в Edit -> XML editor. Я упрощаю структуру значков и оставляю только корневую группу, тогда Android Studio правильно создает векторные чертежи.

Ответы (1)

Решение

Сохраните как «Обычный SVG» в Inkscape.

Примечание. Начиная с Inkscape 0.91, если вы сохраните как «Обычный SVG», а затем просто выполните обычное «Сохранить», он снова будет сохранен как Inkscape SVG. Поэтому вам нужно каждый раз сохранять и явно выбирать простой SVG.

Связанный вопрос о преобразовании SVG в VectorDrawable: Inkscape экспортирует XML для каталога ресурсов Android

Объяснение

Формат сохранения Inkscape по умолчанию — «Inkscape SVG», который представляет собой обычный файл SVG, совместимый со стандартом SVG 1.1, вместе с метаданными и дополнительной информацией, используемой Inkscape в inkscapeпространстве имен.

Это совершенно правильный SVG, и большинство программ рендеринга, таких как браузеры, не имеют с этим проблем. Похоже, ваш рабочий процесс для преобразования из SVG в VectorDrawable XML задыхается от этого кода, специфичного для Inkscape (хотя <defs>действителен ванильный SVG).

Сохранение как «Обычный SVG» удаляет все эти дополнительные данные и любые функции, которые не входят в стандарт SVG. Это улучшит совместимость с другими программами (такими как ваша), но вы можете потерять некоторую информацию, в зависимости от рисунка.

Особенности, которых следует избегать

На сегодняшний день наиболее распространенной нестандартной функцией SVG, которую используют люди, является поток текста. Они создаются путем перетаскивания для создания текстового поля (вместо простого щелчка). Обтекание текстом не поддерживается в SVG — многие программы просто игнорируют текст.

В меню « Текст » в Inkscape есть параметр для преобразования потока текста в обычный текстовый объект SVG.

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

Настройка вывода

В дополнение к использованию «Обычного SVG» есть несколько других функций для настройки дерева SVG в выходных данных Inkscape.

  • В меню « Файл » выберите « Очистка документа» . Это избавляет от неиспользуемых определений и других метаданных.
  • В меню « Правка » нажмите « Настройки » . В разделе « Ввод/вывод » есть несколько вариантов изменения XML.
В итоге я преобразовал текст в путь, используя Path , Object to Path . Работал как шарм. Я использую Inkscape 0.92 и Android Studio 3.1.3.
Еще одна особенность, которой следует избегать: колпачки на концах строк (например , наконечники стрелок ), хранящиеся в <marker>узлах.