Как изменить цвет переносимого вектором пути при нажатии кнопки

С новым обновлением поддержки Android, векторные чертежи получат обратную совместимость. У меня есть векторное изображение с различными путями. Я хочу, чтобы цвет путей изменялся одним нажатием кнопки или программно на основе входного значения. Можно ли получить доступ к параметру имени векторного пути? А затем измените цвет.

Ответы

Ответ 1

Цвет всего вектора можно изменить с помощью setTint.

Вы должны настроить свой ImageView в своем файле макета следующим образом:

<ImageView
    android:id="@+id/myImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:tint="@color/my_nice_color"
    android:src="@drawable/ic_my_drawable"
    android:scaleType="fitCenter" />

Затем, чтобы изменить цвет вашего изображения:

DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color));

Примечание: myImageView.getDrawable() предоставляет исключение nullpointer, если векторный drawable установлен на изображение в качестве фона.

Ответ 2

Вы можете использовать этот метод для изменения цвета в нижнем API для изменения цвета вектора в фрагменте

int myVectorColor = ContextCompat.getColor(getActivity(), R.color.colorBlack);
                    myButton.getIcon().setColorFilter(myVectorColor, PorterDuff.Mode.SRC_IN);

вместо getActivity вы должны использовать MainActivity.this для изменения цвета вектора в активности

Ответ 3

Вы можете изменить цвет отдельного пути во время выполнения, не используя отражение.

VectorMaster представляет динамический контроль над векторными чертежами. Каждый аспект векторного рисования можно управлять динамически (через экземпляры Java), используя эту библиотеку.

Просто добавьте следующую зависимость в свое приложение build.gradle

dependencies {
    compile 'com.sdsmdg.harjot:vectormaster:1.0.9'
}

В вашем случае вам нужно простое изменение цвета:

Векторный пример: your_vector.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
<path
    android:name="outline"
    android:pathData="M20.84,4..."
    android:strokeColor="#5D5D5D"
    android:fillColor="#00000000"
    android:strokeWidth="2"/>

XML

<com.sdsmdg.harjot.vectormaster.VectorMasterView
    android:id="@+id/your_vector"
    android:layout_width="150dp"
    android:layout_height="150dp"
    app:vector_src="@drawable/your_drawable" />

Java

VectorMasterView heartVector = (VectorMasterView) 
findViewById(R.id.your_drawable);

// find the correct path using name
PathModel outline = heartVector.getPathModelByName("outline");

// set the stroke color
outline.setStrokeColor(Color.parseColor("#ED4337"));

// set the fill color (if fill color is not set or is TRANSPARENT, then no fill is drawn)
outline.setFillColor(Color.parseColor("#ED4337"));

От: https://github.com/harjot-oberai/VectorMaster, лицензированный в рамках MIT.

Теперь вы полностью контролируете векторные чертежи.

Ответ 4

Как указано @Eyal в этом сообщении fooobar.com/questions/239656/...

Вы не можете изменить цвет отдельного пути во время выполнения. Если посмотреть на исходный код VectorDrawableCompat, единственным способом разоблачения внутреннего элемента по имени является getTargetByName, который присутствует во внутреннем закрытом классе VectorDrawableCompatState VectorDrawableCompat20 > .

Поскольку это закрытый пакет (по умолчанию), вы не можете его использовать (если вы не используете reflection).

Ответ 5

Проверьте мой ответ на этот другой вопрос: fooobar.com/questions/295078/....

Это отличная идея о том, как управлять этим, используя Темы и параметризуя пути, чтобы иметь возможность устанавливать их динамически.

Ответ 6

Используйте это, чтобы изменить цвет пути в векторном чертеже

VectorChildFinder vector = new VectorChildFinder(this, R.drawable.my_vector, imageView);

VectorDrawableCompat.VFullPath path1 = vector.findPathByName("path1");
path1.setFillColor(Color.RED); 

Библиотека находится здесь: https://github.com/devsideal/VectorChildFinder