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

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

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

Ответ 1

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

Следующие утверждения отлично работают для объявленного 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>

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

<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

Ответ 2

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

PorterDuff.Mode.SRC_ATOP instead
PorterDuff.Mode.MULTIPLY

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

Ответ 3

Вы можете использовать атрибут 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

Ответ 4

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

Он будет работать следующим образом:

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