Я хочу, чтобы программно редактировал заливку цвета векторного файла в Android.
В xml файле я могу установить свой цвет с атрибутом android: fillColor, но я хочу изменить цвет во время выполнения.
Любые примеры для этого? Благодарю.
Я хочу, чтобы программно редактировал заливку цвета векторного файла в Android.
В xml файле я могу установить свой цвет с атрибутом android: fillColor, но я хочу изменить цвет во время выполнения.
Любые примеры для этого? Благодарю.
Это именно то, что вам нужно. Кредиты @emmaguy, автору сообщения. Я просто добавил полную поддержку Support Library 23.4+, которая позволяет прекратить генерировать png во время выполнения:
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
И если эта строка задана в вашей деятельности или приложении onCreate:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
Вы можете использовать ваши SVG не только с srcCompat
, но и с другими атрибутами, такими как drawableLeft
, background
и т.д. в TextView, ToggleButton и т.д. Он также работает, если он используется в селекторах.
Примечание. Я изменил код, чтобы использовать VectorDrawableCompat.create
вместо ResourcesCompat.getDrawable
. В противном случае это не сработает и выбросит org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector
.
Сначала мы создаем атрибуты для двух видов bauble, поэтому мы можем изменить их цвета:
<declare-styleable name="ChristmasTree">
<attr name="bauble_round" format="color" />
<attr name="bauble_small" format="color" />
</declare-styleable>
Затем в VectorDrawable установите части, которые мы хотим динамически изменить, чтобы использовать эти атрибуты:
<path
android:fillColor="?attr/bauble_round"
android:pathData="...." />
<path
android:fillColor="?attr/bauble_small"
android:pathData="...." />
...
Создайте темы и задайте цвета, которые хотите использовать:
<style name="UpdatedScene" parent="DefaultScene">
<item name="bauble_round">#db486e</item>
<item name="bauble_small">#22c7f7</item>
</style>
<style name="DefaultScene">
<item name="bauble_round">#fec758</item>
<item name="bauble_small">#f22424</item>
</style>
Используйте drawable в ImageView:
final ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DefaultScene);
final Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.christmas, wrapper.getTheme());
imageView.setImageDrawable(drawable);
Вот оно! Когда вы хотите изменить цвета, просто установите другую тему, и ваш drawable будет обновляться. Подробную информацию см. В разделе GitHub repo.
Если вы хотите изменить весь цвет, вы можете применить PorterduffColorFilter.
Но это не работает ни для одного <path>
. Только для всего доступного.
public void applyThemeToDrawable(Drawable image) {
if (image != null) {
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,
PorterDuff.Mode.SRC_ATOP);
image.setColorFilter(porterDuffColorFilter);
}
}
VectorDrawable расширяет класс Drawable. См. Документы
добавьте метод setColorFilter()
к вашему векторному контенту изображения (добавлен в уровне 8 api) следующим образом:
imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);