Intereting Posts
Logcat пуст, используя ACRA на устройстве Android – предотвращение перезагрузки WebView при повороте Использует ли однопользовательское приложение многоядерное в android? Как кэшировать android.graphics.path или Bitmap при использовании Overlays? Ваш код версии APK должен быть выше 378 Android OTG: программно отключает питание порта Есть ли способ отключения функции автоматического изменения размера Gmail в макете электронной почты? Android-загрузчики, путь? Векторные чертежи, которые автоматически преобразуются в pngs Удаление неиспользуемых ресурсов из сторонней библиотеки Href = "tel:" на android пытается добавить контакт вместо запуска вызова GCM Key для приложений браузера (со ссылками) неактивен NoClassDefFoundError – Eclipse и Android Преобразование рамки предварительного просмотра в растровое изображение Почему использование XML для создания графического интерфейса является хорошей практикой в ​​Android

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

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

Solutions Collecting From Web of "Векторный клипарт"

Вкратце:

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

Длинный:

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

Глядя на исходный код для VectorDrawable, мы увидим , что информация о внутренних элементах хранится во внутреннем классе private 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 объект.

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