问题
I have an ImageView
with android:src
set to a ShapedDrawable
, namely a white circle. What I want is to colorize this ImageView
in runtime responding to some events. imgView.setColorFilter
seems to be solution, but after using this (tried different parameters) the image becomes invisible (I don't see it at the screen).
How to solve this? And are there better ways to have color circles?
回答1:
Alright, I had a quick play with this and noticed your issue of the circles disappearing. Without you describing what exactly you tried, I assume you haven't tried setting the color filter to the Drawable
itself yet? (as opposed to the ImageView
, which only seems to work with BitmapDrawable
s).
The following statements work perfectly fine for an xml-declared ShapeDrawable
with white as initial color:
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 );
The ShapeDrawable
for completeness: (I set the size on the ImageView
, see below)
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
<solid android:color="@android:color/white" />
</shape>
And one of the ImageView
s as example:
<ImageView
android:id="@+id/circle_red_imageview"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/circle_white" />
Visual result:
回答2:
If you want to change Image Color use
PorterDuff.Mode.SRC_ATOP instead
PorterDuff.Mode.MULTIPLY
in above example.
回答3:
You can use attribute android:tint
in ImageView in xml.
Example:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/your_drawable"
android:tint="@color/your_color" />
Tested on Android 4.1.2 and 6.0.1
回答4:
You can do it very very simple using this library: https://github.com/jrvansuita/IconHandler
It will working like this:
Icon.on(yourImageView).color(R.color.your_color).icon(R.mipmap.your_icon).put();
来源:https://stackoverflow.com/questions/10114420/applying-colorfilter-to-imageview-with-shapeddrawable