Ответ 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
удалить объект.