Я пытаюсь использовать векторные чертежи в своем приложении для Android. Из http://developer.android.com/training/material/drawables.html (выделено мной):
В Android 5.0 (уровень API 21) и выше вы можете определять векторные чертежи, которые масштабируются без потери определения.
Используя этот чертеж:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
и этот ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
создает это размытое изображение при попытке отобразить значок с разрешением 400 dp (на большом мобильном устройстве с высоким разрешением около 2015 года, на котором запущен леденец на палочке):
Изменение ширины и высоты в определении вектора, доступного для рисования, на 200dp значительно улучшает ситуацию при отображаемом размере 400dp. Однако, если установить его как доступный для рисования для элемента TextView (то есть значок слева от текста), теперь создается огромный значок.
Мои вопросы:
1) Почему в векторном чертеже указана ширина / высота? Я думал, что все дело в том, что они масштабируются вверх и вниз без потерь, делая ширину и высоту бессмысленными в своем определении?
2) Можно ли использовать один вектор, который можно рисовать как 24dp в TextView, но хорошо масштабируется, чтобы использовать гораздо большие изображения? Например, как мне избежать создания нескольких векторных чертежей разных размеров и вместо этого использовать тот, который масштабируется в соответствии с моими требованиями к визуализации?
3) Как эффективно использовать атрибуты ширины / высоты и в чем разница с viewportWidth / Height?
Дополнительные детали:
- Устройство работает под управлением API 22
- Использование Android Studio v1.5.1 с Gradle версии 1.5.0
- Манифест - это компиляция и целевой уровень 23, минимальный уровень 15. Я также пробовал переместить минимальный уровень на 21, но это не имело никакого значения.
- Декомпиляция APK (с минимальным уровнем 21) показывает единственный ресурс XML в папке с возможностью переноса. Растровые изображения не создаются.
New -> Vector Asset
ее, в мою папку с возможностью рисования удаляется XML-файл векторного изображения. Однако если я использую apktool для распаковки созданного APK, я вижу, что файлы XMLdrawable-anydpi-v21
правильно масштабируются на устройствах с API 21+. Растровые файлы помещаются вdrawable-<mdpi/hdpi/etc>-v4
папки и не используются на устройствах с API 21+ (на основании того факта, что они правильно масштабируются)drawable
папка. Ширина / высота в векторном XML-файле с возможностью рисования составляет 24dp. Указание ImageView с высотой / шириной 400dp определенно создает плохо масштабируемое изображение.drawable-anydpi-v21
это то, что myminSdkVersion
меньше 21. Какие-нибудь изменения в поведении, если вы установитеminSdkVersion
меньше 21? А как насчет переноса XML вdrawable-anydpi
? Я бы не ожидал, что что-то изменится, но я бы также ожидал, что ваше векторное изображение будет правильно масштабироваться ...drawable-anydpi-v21
с различными растровыми изображениями в mdi / hdpi / etc. папки. Однако никаких изменений в конечном результате рендеринга не произошло.Ответы:
Здесь есть новая информация об этой проблеме:
https://code.google.com/p/android/issues/detail?id=202019
Похоже, что использование
android:scaleType="fitXY"
позволит правильно масштабировать леденец на палочке.От инженера Google:
источник
Для версий SDK менее 21, когда системе сборки необходимо генерировать растровые изображения, и в качестве размера по умолчанию в случаях, когда вы не указываете ширину / высоту.
Я не верю, что это возможно, если вам также нужно настроить таргетинг на SDK меньше 21.
Документация: (на самом деле не очень полезно сейчас, когда я ее перечитал ...)
Дополнительная документация:
Изменить: происходит что-то странное. Вот мои результаты в эмуляторе SDK версии 23 (тестовое устройство Lollipop + сейчас мертво ...):
И в эмуляторе SDK версии 21:
источник
width
height
viewport
height
иwidth
откудаxml
?AppCompat 23.2 представляет векторные чертежи для всех устройств под управлением Android 2.1 и выше. Изображения масштабируются правильно, независимо от ширины / высоты, указанной в XML-файле векторного чертежа. К сожалению, эта реализация не используется в API уровня 21 и выше (в пользу собственной реализации).
Хорошая новость заключается в том, что мы можем заставить AppCompat использовать его реализацию на уровнях API 21 и 22. Плохая новость в том, что для этого мы должны использовать отражение.
Прежде всего, убедитесь, что вы используете последнюю версию AppCompat и включили новую реализацию вектора:
Затем вызовите
useCompatVectorIfNeeded();
onCreate () вашего приложения:Наконец, убедитесь, что вы используете
app:srcCompat
вместоandroid:src
установки изображения ImageView:Ваши векторные чертежи теперь должны правильно масштабироваться!
источник
1) Почему в векторном чертеже указана ширина / высота? Я думал, что все дело в том, что они масштабируются вверх и вниз без потерь, делая ширину и высоту бессмысленными в своем определении?
2) Можно ли использовать один векторный рисунок, который работает как рисунок 24dp в TextView, а также изображение с большой шириной экрана?
3) Как эффективно использовать атрибуты ширины / высоты и в чем разница с viewportWidth / Height?
источник
Я решаю свою проблему, просто меняя размер векторного изображения. С самого начала это был ресурс вроде:
И я изменил его на 150dp (размер ImageView в макете с этим векторным ресурсом), например:
У меня это работает.
источник
Я пробую эти способы, но, к сожалению, ни один из них не сработал. Я стараюсь
fitXY
вImageView
, я попробовать использовать ,app:srcCompat
но не могу даже использовать его. но я нашел хитрый способ:Но суть в этом способе - размеры просмотров. если у вас
ImageView
неправильные размеры, drawable получает Stretch. вы должны контролировать его в версиях, предшествующих леденцу, или использовать некоторые представленияPercentRelativeLayout
.Надеюсь, это поможет.
источник
Во-первых : импортируйте svg в drawble: (( https://www.learn2crack.com/2016/02/android-studio-svg.html ))
Во-вторых : если вам нужна поддержка со стороны Android API 7+, вам необходимо использовать запись библиотеки поддержки Android (( https://stackoverflow.com/a/44713221/1140304 ))
1- добавить
в ваш файл build.gradle.
2-Используйте пространство имен в вашем макете, в котором есть imageView:
В-третьих : установите imageView с android: scaleType = "fitXY" и используйте app: srcCompat
В-четвертых : если вы хотите установить svg в java-код, вам нужно добавить строку ниже при oncreate methoded
источник
Для меня причиной преобразования векторов в png был
android:fillType="evenodd"
атрибут в моем векторе. Когда я удалил все вхождения этого атрибута в моем чертеже (для этого использовалсяnonzero
тип заливки по умолчанию, примененный к вектору), в следующий раз, когда приложение было построено, все было в порядке.источник