Подтвердить что ты не робот

Измените fillColor вектора в android программно

Я хочу, чтобы программно редактировал заливку цвета векторного файла в Android.

В xml файле я могу установить свой цвет с атрибутом android: fillColor, но я хочу изменить цвет во время выполнения.

Любые примеры для этого? Благодарю.

4b9b3361

Ответ 1

Это именно то, что вам нужно. Кредиты @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.

Ответ 2

Если вы хотите изменить весь цвет, вы можете применить 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. См. Документы

Ответ 3

добавьте метод setColorFilter() к вашему векторному контенту изображения (добавлен в уровне 8 api) следующим образом:

imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);