Программно подкрасить опорный вектор
Android Studio версии 2.1, версия gradle 2.1.0, пожалуйста, исправьте меня, если вы обнаружите какие-либо неверные интерпретации :)
Я запутался насчет векторов поддержки в библиотеке поддержки 23.3.0. В частности, я хотел бы подкрасить программную кнопку изображения, чей src определен для рисования вектором. Из того, что я могу сказать, это не возможно на предварительном леденце на палочке теперь.
Я прочитал несколько связанных постов об изменениях:23.2.0 объявление и изменения:
Начиная с библиотеки поддержки Android 23.3.0, поддерживаемые векторные рисунки могут быть загружены только через app: srcCompat или setImageResource ().
Означает ли вышесказанное, что вектор xmls можно использовать только перед началом 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);
Попытки бросков перед леденцом на палочке: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);
Это бросает ту же ошибку на pre-Lollipop.
Однако если я удалюvectorDrawables.useSupportLibrary = true
как указаноЯн Лейк здесьс намерением иметь инструменты сборки автоматически генерировать png для устройств перед Lollipop,pngs не подкрашивают перед леденцом на палочкетак что я вернулся к исходной точке.
Я также попытался указать вектор черезsrcCompat
и извлекать его программно, но я не думаю, что смог достичь этого, даже если он работает на пост-леденце, если вектор указан с использованиемsrc
вместо.
Таким образом, ситуация для 23.3.0 выглядит так:
Пост-леденец:src
а такжеsrcCompat
принимать только векторыsrc
может быть извлечен из вида как чертеж для программного тонирования. Ссылка на векторы в коде возможна с помощью getDrawable, и они могут быть окрашены.
Pre-Lollipop: srcCompat может принимать только векторы, не может быть получен программно из представления для тонирования.setImageResource
может принимать векторы, но только еслиvectorDrawables.useSupportLibrary = false
и тонировка не работает. Аналогично ссылаться на векторы в коде невозможно, если толькоvectorDrawables.useSupportLibrary = false
и тонировка не работает.
Работа на всех версиях с использованием pngs:
Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_nav_exit_community);
DrawableCompat.setTint(bg, headerTitleColor);
exitButton.setImageDrawable(bg);
Приложение:
Эта техника также работает с пост-леденцом на палочке, но, как и другие на пред-леденце, я получаю рисование, но не тонирую:
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);