Страницы

Поиск по вопросам

пятница, 21 июня 2019 г.

Изменение цвета на png программно

Есть изображение .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 задать в разметке...

Комментариев нет:

Отправить комментарий