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

Векторный клипарт

У меня VectorDrawable состоит из 9 прямоугольников. Это определяется как XML в папке drawables. Я установил это как фон для ImageView, который я объявил в xml. android:src="@drawable/squares00" Я хотел бы изменить цвет одного или нескольких квадратов программно во время выполнения. Я знаю, что есть способ сделать это, используя анимацию VectorDrawable. Но мне было интересно, есть ли более простой способ доступа к моему vectorDrawable в java, обновляя его свойства (устанавливая один или несколько цветов заливки для прямоугольников), а затем обновляя фон с обновленным VectoDrawable. Моя цель - Android API 21 (леденец)

4b9b3361

Ответ 1

Короче:

  • У вас не есть прямой доступ к внутренним элементам в VectorDrawable.
  • AnimatedVectorDrawable имеет доступ только к внутренним элементам.
  • Используйте AnimatedVectorDrawable, чтобы имитировать то, что вам нужно.

Long

1. У вас нет доступа

Глядя на исходный код для VectorDrawable, вы увидите, что информация о внутренних элементах хранится в внутренний закрытый класс состояния VectorDrawableState. Единственный способ выставить внутренний элемент по имени getTargetByName, но, к сожалению, он является закрытым (по умолчанию) - вы не можете его использовать (если вы не используете отражение).

2. AnimatedVectorDrawable имеет доступ только

getTargetByName используется только AnimatedVectorDrawable, как мы можем найти для поиска использования метода.

3. Используйте AnimatedVectorDrawable

Итак, теперь, когда мы видим, что это единственный доступный параметр, например, мы можем попробовать следующее изменить цвет элемента "rect2" от белого до черного:

change_color.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="0"
        android:propertyName="fillColor"
        android:valueFrom="@color/white"
        android:valueTo="@color/black"/>
</set>

animation.xml:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/vectordrawable" >
    <target
        android:name="rect2"
        android:animation="@anim/change_color" />
</animated-vector>

и используйте описанный подход здесь.

Примечание

Если приведенное выше значение по-прежнему не является для вас вариантом, вы можете попробовать следующее:

  • Скопируйте весь VectorDrawable и настройте его (не проверено).
  • Используйте отражение для getTargetByName, чтобы получить внутренний элемент. Сначала вам нужно будет mutate удалить объект.

Ответ 2

Используйте эту библиотеку для прямого доступа к внутренним элементам. Он реализует этот ответ