如何在android中以編程方式設置圖像視圖的色調?



7 Answers

@哈迪克說得對。 代碼中的其他錯誤是當您引用XML定義的顏色時。 當您應該使用ID來定位顏色資源並將資源傳遞給setColorFilter方法時,您只將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() (don別問我為什麼)。

否則,你的代碼看起來不錯。 (儘管我還沒有太多研究setColorFilter方法......)

android imageview tint

需要為圖像視圖設置色調...我按照以下方式使用它:

imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);

但它不會改變...




大多數答案指的是使用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);



從Lollipop開始,還有一個適用於新Palette類的BitmapDrawable的tint方法:

public void setTintList(ColorStateList tint)

public void setTintMode(PorterDuff.Mode tintMode)

在較舊版本的Android上,現在可以使用DrawableCompat




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);



由於第一個答案不適合我:

//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來解決這個問題。

我希望我能幫助任何人:-)




正如@milosmns所說,你應該使用imageView.setColorFilter imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

此API需要顏色值而不是顏色資源ID,這是您的語句無法正常工作的根本原因。




如果你的顏色有十六進制透明度,請使用下面的代碼。

ImageViewCompat.setImageTintMode(img,PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(img,ColorStateList.valueOf(Color.parseColor("#80000000")));

清除色彩

ImageViewCompat.setImageTintList(img, null);



Related