需要为图像视图设置色调...我以以下方式使用它:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
但这并没有改变...
需要为图像视图设置色调...我以以下方式使用它:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
但这并没有改变...
Answers:
您可以通过以下代码很容易地在代码中更改颜色:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
//白色色调
如果您想要色彩,那么
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);
对于矢量可绘制
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);
UPDATE:
@ADev在他的回答较新的解决方案在这里,但他的解决方案需要新的支持库- 25.4.0或更高版本。
android:tint
适用于所有android版本。也许您在说什么drawableTint
?
大多数答案是指使用setColorFilter
哪个不是最初要求的。
用户@Tad 的回答正确,但是仅适用于API 21+。
要在所有Android版本上设置色彩,请使用ImageViewCompat
:
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));
请注意,yourTint
在这种情况下,必须为“ color int”。如果您有类似的颜色资源R.color.blue
,则需要先加载int颜色:
ContextCompat.getColor(context, R.color.blue);
ImageView
具有AppCompat主题的xml 实例或AppCompatImageView
子类。
这对我有用
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik说的对。代码中的另一个错误是当您引用XML定义的颜色时。setColorFilter
当您应使用ID定位颜色资源并将资源传递给方法时,仅将ID 传递给了setColorFilter
方法。在下面重写您的原始代码。
如果此行在您的活动范围内:
imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
否则,您需要引用您的主要活动:
Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
请注意,其他类型的资源也是如此,例如整数,布尔值,尺寸等。除了字符串,您可以直接使用字符串 getString()
在“活动”中而无需先调用getResources()
(不要问我为什么) 。
否则,您的代码看起来不错。(尽管我没有对此setColorFilter
方法进行过多研究...)
从Lollipop开始,BitmapDrawables 的着色方法也可以与新的Palette类一起使用:
公共无效setTintList(ColorStateList色彩)
和
公共无效setTintMode(PorterDuff.Mode tintMode)
在旧版Android上,您现在可以使用DrawableCompat库
尝试这个。它应该在支持库支持的所有Android版本上运行:
public static Drawable getTintedDrawableOfColorResId(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorRes int colorResId) {
return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), ContextCompat.getColor(context, colorResId));
}
public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorInt int color) {
return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), color);
}
public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) {
Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable);
DrawableCompat.setTint(wrapDrawable, color);
DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN);
return wrapDrawable;
}
您可以使用上述任何一种来使其工作。
您可以在docs上阅读有关DrawableCompat更有趣的功能的信息。
imageView.getBackground()
才能获取drawable,因为imageView.getDrawable()
它返回的是null。
借助ADev,更好地简化了扩展功能
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
用法:-
imageView.setTint(R.color.tintColor)
如果您的颜色具有十六进制透明度,请使用以下代码。
ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));
清除色彩
ImageViewCompat.setImageTintList(imageView, null);
img
的类型为ImageView。
简单一行
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
作为第一个答案对我不起作用:
//get ImageView
ImageView myImageView = (ImageView) findViewById(R.id.iv);
//colorid is the id of a color defined in values/colors.xml
myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid)));
这似乎仅在API 21+中有效,但是对我来说这不是问题。您可以使用ImageViewCompat解决该问题。
我希望我能帮助任何人:-)
从棒棒糖开始,有一种叫做的方法ImageView#setImageTintList()
,您可以使用...的优点是,它只需要一种ColorStateList
颜色,而不是一种颜色,因此可以使图像知道色调。
在棒棒糖之前的设备上,您可以通过对可绘制对象进行着色然后将其设置为ImageView
图像可绘制对象来获得相同的行为:
ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);
Random random=new Random;
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
ColorFilter cf = new PorterDuffColorFilter(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)),Mode.OVERLAY);
imageView.setImageResource(R.drawable.ic_bg_box);
imageView.setColorFilter(cf);
自从Kotlin被广泛采用以来,它就添加了ADev的答案(我认为这是最正确的)及其有用的扩展功能:
fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
val color = ContextCompat.getColor(context, colorId)
val colorStateList = ColorStateList.valueOf(color)
ImageViewCompat.setImageTintList(this, colorStateList)
}
我认为这是一个功能,可以在任何Android项目中使用!
我发现我们可以将颜色选择器用于色调attr:
mImageView.setEnabled(true);
activity_main.xml:
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_arrowup"
android:tint="@color/section_arrowup_color" />
section_arrowup_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/white" android:state_enabled="true"/>
<item android:color="@android:color/black" android:state_enabled="false"/>
<item android:color="@android:color/white"/>
</selector>
app:srcCompat
代替android:src
,并将其添加vectorDrawables.useSupportLibrary = true
到defaultConfig
build.gradle文件的一部分中。经过测试,可以在Kitkat模拟器上正常工作。
不要使用PoterDuff.Mode
,使用setColorFilter()
它对所有人都有效。
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
我参加聚会很晚,但是我没有看到上面的解决方案。我们可以通过设置色彩setImageResource()
(我的minSdkVersion是24)。
因此,首先,您需要创建一个选择器并将其保存在/drawable
资产文件夹中(我称之为ic_color_white_green_search.xml
)
<!-- Focused and not pressed -->
<item android:state_focused="true"
android:state_pressed="false">
<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>
<!-- Focused and pressed -->
<item android:state_focused="true"
android:state_pressed="true">
<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>
<!-- Default -->
<item android:drawable="@drawable/ic_search"/>
然后在这样的代码中设置它:
val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
如果您想将选择器设置为色调:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
Kotlin解决方案使用扩展功能来设置和取消着色:
fun ImageView.setTint(@ColorInt color: Int?) {
if (color == null) {
ImageViewCompat.setImageTintList(this, null)
return
}
ImageViewCompat.setImageTintMode(this, PorterDuff.Mode.SRC_ATOP)
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color))
}
不是确切的答案,而是一个更简单的选择:
这是一个片段:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="@dimen/height120"
android:contentDescription="@string/my_description"
android:scaleType="fitXY"
android:src="@drawable/my_awesome_image"/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/height120"
android:alpha="0.5"
android:background="@color/my_blue_color"/>
</FrameLayout>
png
。那背景不会改变吗?Alpha和色调也有很大不同。色调就像换色,如果我没看错的话。无意冒犯。只是想帮助:)