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

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

Цвет всего вектора можно изменить с помощью 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() дает nullpointerexception, если векторный drawable установлен на изображение в качестве фона.

Проверьте мой ответ на этот другой вопрос: https://stackoverflow.com/a/38418049/1335438 .

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

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

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

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

Как заявил @Eyal в этом сообщении https://stackoverflow.com/a/32007436/4969047

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

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