Есть изображение .png, это иконка для таба, для нее я сделал селектор, что бы при активном и неактивном табе она имела разный цвет. Пробовал PorterDuff.Mode но результат не совсем такой как я хотел. Меня интересует как можно заменить в селекторе цвет активной иконки динамически. Что бы вместо фиолетовой иконки можно было сделать, красную, зеленую, желтую и т.д.
Пример моего селектора:
Пример иконки:
Ответ
Изменить цвет можно так:
TintIcons.java
public class TintIcons {
public static Drawable tintIcon(Drawable icon, ColorStateList colorStateList) {
if(icon!=null) {
icon = DrawableCompat.wrap(icon).mutate();
DrawableCompat.setTintList(icon, colorStateList);
DrawableCompat.setTintMode(icon, PorterDuff.Mode.SRC_IN);
}
return icon;
}
public static void tintImageView(ImageView imageView, int colorStateListResId) {
ColorStateList list = ContextCompat.getColorStateList(imageView.getContext(), colorStateListResId);
if (list != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
imageView.setImageTintList(list);
} else {
imageView.setImageDrawable(tintIcon(imageView.getDrawable(), list));
}
}
}
}
/res/color/icon_state_list.xml
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TintIcons.tintImageView((ImageView) findViewById(R.id.img_view), R.color.icon_state_list);
}
}
Вместо списка состояний можно передавать просто цвет (например, R.color.colorPrimary), тогда картинка просто перекрасится. Аналогично можно перекрасить фон кнопок и т.д. (получив предварительно картинку фона через imageView.getBackground()).
Как видно все эти причуды нужны для pre-Lollipop. Для lollipop+ достаточно titnList задать в разметке...
Комментариев нет:
Отправить комментарий