Программный оттенок вектора поддержки

Android Studio версии 2.1, gradle version 2.1.0, пожалуйста, исправьте меня, если вы заметите какие-либо неверные толкования 🙂

Я смущен о вспомогательных векторах в библиотеке поддержки 23.3.0. В частности, то, что я хотел бы сделать, – это тонировка кнопки изображения программно, чья src определена, вектор является векторным. Из того, что я могу сказать, это невозможно сейчас на прелюлипопе.

Я прочитал несколько связанных сообщений об изменениях: объявление и изменения 23.2.0 :

Начиная с Android Support Library 23.3.0, поддержка векторных чертежей может быть загружена только через приложение: srcCompat или setImageResource ().

Означает ли это, что вектор xmls можно использовать только pre-Lollipop через srcCompat или setImageResource () и поэтому не может быть динамически тонирован ?

Вот моя основная кнопка изображения:

<ImageButton android:id="@+id/nav_header_exit_community_button" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:background="@null"/> 

Работает только на Lollipop и выше:

  Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageDrawable(bg); 

Попытка этого pre-lollipop бросает: android.content.res.Resources$NotFoundException: File res/drawable/ic_exit_to_app_24dp.xml from drawable resource ID #0x7f0200bf

Также работает только на Lollipop и выше

  Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageResource(R.drawable.ic_exit_to_app_24dp); 

Это порождает ту же ошибку на пред-Lollipop.

Однако, если я vectorDrawables.useSupportLibrary = true как указано здесь здесь , vectorDrawables.useSupportLibrary = true Лейк , с целью создания автоматических генераторов для создания pre-Lollipop-устройств, pngs не тонируют на pre-lollipop , поэтому я вернулся Квадратный.

Я также попытался указать вектор через srcCompat и получить его программным srcCompat но я не думаю, что смог достичь этого, даже если он работает на post-Lollipop, если вектор указан с использованием src .

Таким образом, ситуация для 23.3.0 выглядит следующим образом:

  • Post-Lollipop: src и srcCompat принимают векторы, только src может быть извлечен из представления как готовый для тонирования программным способом. Ссылка на векторы в коде возможна с помощью getDrawable, и они могут быть тонированы.

  • Pre-Lollipop: srcCompat может принимать только векторы, не может быть запрограммирован с точки зрения для тонирования. setImageResource может принимать векторы, но только если vectorDrawables.useSupportLibrary = false и тонирование не работает. Аналогичным образом ссылки на векторы в коде невозможно, если vectorDrawables.useSupportLibrary = false и vectorDrawables.useSupportLibrary = false не работают.

Работа со всеми версиями с использованием png:

  Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_nav_exit_community); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageDrawable(bg); 

Приложение:

Этот метод также работает на пост-Lollipop, но, как и другие на pre-Lollipop, я получаю возможность рисования, но без тонировки:

  Drawable bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageDrawable(bg); 

ВИД РЕШЕНИЯ:

Благодаря ответу Джона до сих пор единственным способом, который я могу придумать, чтобы подчеркнуть вектор поддержки, является установка на него цветового фильтра – это означает, что функция DrawableCompat.setTint() по-видимому, не работает для меня, Вопрос – вектор поддержки. Я не уверен, что это законная ошибка, ожидаемое поведение или если я просто делаю что-то неправильно!

Вот решение, с которым я собираюсь на данный момент:

  Drawable bg; if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null); exitButton.setColorFilter(headerTitleColor, PorterDuff.Mode.MULTIPLY); } else { bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); } exitButton.setImageDrawable(bg); 

Solutions Collecting From Web of "Программный оттенок вектора поддержки"

Прежде всего, вы должны использовать VectorDrawableCompat#create , как только у вас есть Drawable вы должны вызвать DrawableCompat#wrap :

Потенциально завершайте перенос, чтобы он мог использоваться для тонирования по различным уровням API через методы тонирования в этом классе.

Поэтому ваш код будет выглядеть так:

 ImageView iv = .... Drawable d = VectorDrawableCompat.create(getResources(), R.drawable.ic_exit_to_app_24dp, null); d = DrawableCompat.wrap(d); DrawableCompat.setTint(d, headerTitleColor); iv.setImageDrawable(d); 

Вы можете использовать метод setColorFilter для ImageView:

imageView.setColorFilter(headerTitleColor, android.graphics.PorterDuff.Mode.MULTIPLY);