it-roy-ru.com

Применение ColorFilter к ImageView с помощью ShapedDrawable

У меня есть ImageView с Android:src, установленным в ShapedDrawable, а именно белый круг. Я хочу раскрасить эту ImageView во время выполнения, отвечая на некоторые события. imgView.setColorFilter кажется решением, но после использования этого (пробовал другие параметры) изображение становится невидимым (я не вижу его на экране).

Как это решить? И есть ли лучшие способы иметь цветные круги?

36
aplavin

Хорошо, я быстро поиграл с этим и заметил твою проблему исчезновения кругов. Если вы не описали что именно вы пытались, я предполагаю, что вы еще не пытались установить цветовой фильтр для самой Drawable? (в отличие от ImageView, который работает только с BitmapDrawables).

Следующие операторы прекрасно работают для объявленной в xml ShapeDrawable с белым в качестве исходного цвета:

ImageView redCircle = (ImageView) findViewById(R.id.circle_red_imageview);
ImageView greenCircle = (ImageView) findViewById(R.id.circle_green_imageview);
ImageView blueCircle = (ImageView) findViewById(R.id.circle_blue_imageview);

// we can create the color values in different ways:
redCircle.getDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY );
greenCircle.getDrawable().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY );
blueCircle.getDrawable().setColorFilter(getResources().getColor(R.color.blue), PorterDuff.Mode.MULTIPLY );

ShapeDrawable для полноты: (я установил размер для ImageView, см. Ниже)

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="oval" >
    <solid Android:color="@Android:color/white" />
</shape>

И один из ImageViews как пример:

<ImageView
    Android:id="@+id/circle_red_imageview"
    Android:layout_width="40dp"
    Android:layout_height="40dp"
    Android:padding="5dp"
    Android:src="@drawable/circle_white" />

Визуальный результат:

Screenshot of colored circles

99
MH.

Если вы хотите изменить цвет изображения, используйте 

PorterDuff.Mode.SRC_ATOP instead
PorterDuff.Mode.MULTIPLY

в приведенном выше примере.

12
Vishwas Vaishnav

Вы можете использовать атрибут Android:tint в ImageView в xml.

Пример:

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/your_drawable"
    Android:tint="@color/your_color" />

Протестировано на Android 4.1.2 и 6.0.1

6
Volodymyr Yatsykiv

Вы можете сделать это очень просто, используя эту библиотеку: https://github.com/jrvansuita/IconHandler

Это будет работать так:

Icon.on(yourImageView).color(R.color.your_color).icon(R.mipmap.your_icon).put();
0
Vansuita Jr.