Android'de programlı bir görüntü görünümü için renk tonu nasıl ayarlanır?


396

Bir görüntü görünümü için renk tonu ayarlamanız gerekiyor ... Bunu şu şekilde kullanıyorum:

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

Ama değişmiyor ...


15
. Bunun yerine tamsayı renk değeri tamsayı kaynak kimliği kullanmış olabilir, GetResources () için R.color.blue dönüştürmeye çalışacağız getColor (R.color.blue)
milosmns

Çekilebilir çekilebilir = ...; drawable.setColorFilter (ContextCompat.getColor (bağlam, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (çekilebilir); // burada herhangi bir renk kullanılabilir
flame3

Yanıtlar:


916

Renk tonunu kodla kolayca değiştirebilirsiniz:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Beyaz Renk Tonu

Renk tonu istiyorsanız

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);

Çekilebilir Vektör İçin

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);

GÜNCELLEME :
@ADev'in cevabında daha yeni bir çözümü var , ancak çözümü daha yeni destek kütüphanesi gerektiriyor - 25.4.0 veya üstü.



12
Xml, android: tint = "@ color / blue"
Luis

1
Artı android: renk tonu 21+ olduğunu
androidguy

8
android:tinttüm android sürümlerinde çalışır. Belki de neden bahsediyorsun drawableTint?
finstas

11
PorterDuff.Mode.MULTIPLY benim durumumda çalışmıyor PorterDuff.Mode.SRC_IN kullandım ve işe yarıyor
Mohamed Nageh

234

Çoğu cevap setColorFilter, başlangıçta sorulanın kullanılmadığı anlamına gelir.

@Tad kullanıcısının cevabı doğru yönde ama sadece API 21+ üzerinde çalışıyor.

Tüm Android sürümlerinde renk tonunu ayarlamak için şunu kullanın ImageViewCompat:

ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));

yourTintBu durumda bir "renk int" olması gerektiğini unutmayın . Gibi bir renk kaynağınız varsa R.color.blue, önce int rengini yüklemeniz gerekir:

ContextCompat.getColor(context, R.color.blue);

6
Kabul edilen cevap olmalı. Yalnızca ImageViewAppCompat temalı xml örneklerinde veya AppCompatImageViewalt sınıflarda çalıştığını unutmayın .
Louis CAD

1
@ADev çözümünüzü takdir ediyor ancak soru 2013'te soruldu ve sırasıyla Haziran 2017'de 25.4.0 ve 25.1.0 Aralık 2016'da v4 destek lib ile ImageViewCompat ve AppCompatImageView sürümü :)
Hardik

1
@ ADev elbette ama çözümünüzde yeni olduğunu ve daha yeni destek kütüphanesi 25.4.0 ve üstü gerektirdiğinden cevabınızda düzgün bir şekilde bahsetmediniz, çünkü destek libinin daha düşük sürümüyle bu sınıf mevcut değildir, böylece kimse bulamaz! !! Bu arada cevabı düzenledim :) iyi günler ...
Hardik

Bu, API 16'da çalışmaz
Tayyab Mazhar

49

Bu benim için çalıştı

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));

evet, benim için de çalıştı, ikinci parametre olmadan .. o da gidebilirmImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammed

seçildi ve ikinci parametre olmadan, cazibe gibi çalışır. Thx @ toobsco42
Ravi Vaniya

35

@Hardik doğru. Kodunuzdaki diğer hata, XML tanımlı renginize başvurduğunuzda ortaya çıkar. Sen sadece kimliği geçirilen setColorFilterrenk kaynağı bulmak için kimliğini kullanın ve geçmelidir yöntemle, kaynak için setColorFilteryöntemiyle. Orijinal kodunuzu aşağıda yeniden yazın.

Bu satır etkinliğiniz dahilindeyse:

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

Aksi takdirde, ana faaliyetinize başvurmanız gerekir:

Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

Bunun tamsayılar, bools, boyutlar, vb. Gibi diğer kaynak türleri için de geçerli olduğunu unutmayın. Dize hariç, getString()ilk çağrıyı gerektirmeden doğrudan Etkinliğinizde kullanabilirsiniz getResources()(nedenini sorma) .

Aksi takdirde, kodunuz iyi görünür. (Yine de setColorFilteryöntemi çok fazla araştırmamış olsam da ...)


22

Tüm yöntemleri denedikten sonra benim için çalışmadılar.

Başka bir PortDuff.MODE kullanarak çözüm olsun.

imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);

14

Lollipop ile başlayarak , yeni Palette sınıfıyla çalışan BitmapDrawables için bir renk tonu yöntemi de vardır :

genel geçersiz setTintList (ColorStateList renk tonu)

ve

genel geçersiz setTintMode (PorterDuff.Mode tintMode)

Android'in eski sürümlerinde, artık DrawableCompat kitaplığını kullanabilirsiniz


2
aslında destek kütüphanesi bunu destekliyor. Cevabımı gör: stackoverflow.com/a/34479043/878126
android geliştirici

12

Bunu dene. Destek kitaplığının desteklediği tüm Android sürümlerinde çalışmalıdır:

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

Çalıştırmak için yukarıdakilerden herhangi birini kullanabilirsiniz.

Sen, dokümanlar üzerinde DrawableCompat daha ilginç özellikleri okuyabilirsiniz burada .


1
Ben de imageView.getBackground()çekilebilir almak zorunda , çünkü imageView.getDrawable()null dönüyordu.
Rock Lee

Resim görünümünde xml veya setImageResource kodunda src kullandığınızdan emin olun
orelzion

imageview arka plan için renk tonu ayarlamak için mükemmel bir yoldur
leegor

12

ADev sayesinde daha iyi basitleştirilmiş uzatma işlevi

fun ImageView.setTint(@ColorRes colorRes: Int) {
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}

Kullanımı: -

imageView.setTint(R.color.tintColor)

Button / TextView metin tonu için benzer bir şey var mı?
android geliştirici

metin görünümü metin çizilebilir için renk veya renk tonu demek?
Manohar Reddy

"Metin tonu" demek istiyorum. Metnin rengi. Ama bence bu oldukça sorunlu, çünkü metin her durum için bir renge sahip ... O zaman yine, vurgu rengini ayarladığımda bunun nasıl işe yaradığını ... Garip .... Belki de vurgu rengini ayarlamak mümkün mü belirli bir Düğme (veya TextView), programlı olarak?
android geliştirici

11

Rengin onaltılık saydamlığı varsa, aşağıdaki kodu kullanın.

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

Renk tonunu temizlemek için

ImageViewCompat.setImageTintList(imageView, null);

"img" tipi nedir
Beyaz

1
@Beyaz imgImageView türündedir .
Sai

10

Basit ve tek satır

imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));

9

İlk cevap benim için işe yaramadığı için:

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

Bu sadece API 21 + 'da çalışıyor gibi görünüyor, ama benim için bu bir sorun değildi. Bu sorunu çözmek için bir ImageViewCompat kullanabilirsiniz, tho.

Umarım herkese yardım ederim :-)


7

Lollipop'tan başlayarak ImageView#setImageTintList(), kullanabileceğiniz bir yöntem var ... avantajı ColorStateList, sadece tek bir rengin aksine bir şey alması , böylece görüntünün renk tonunu devlet farkında hale getirmesidir.

Lollipop öncesi cihazlarda, çekilebilir renk tonunu çizip ardından ImageView'çizilebilir resim' olarak ayarlayarak aynı davranışı elde edebilirsiniz :

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);

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

6

Android'de programlı bir görüntü görünümü için renk tonu ayarlamak için

Android için iki yöntemim var:

1)

imgView.setColorFilter(context.getResources().getColor(R.color.blue));

2)

 DrawableCompat.setTint(imgView.getDrawable(),
                     ContextCompat.getColor(context, R.color.blue));

Umarım herkese yardım ederim :-)


4

Ekleme ADEV 'ın cevabı KOTLIN ve bunun yararlı uzatma fonksiyonlarının yaygınlaşmasının beri, (bence en doğru):

fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
    val color = ContextCompat.getColor(context, colorId)
    val colorStateList = ColorStateList.valueOf(color)
    ImageViewCompat.setImageTintList(this, colorStateList)
}

Bunun herhangi bir Android projesinde yararlı olabilecek bir işlev olduğunu düşünüyorum!


4

Renk tonu renk tonu attr için kullanabiliriz:

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>

Merhaba, Vektör çizilebilir için çalışmıyor ... Aynı şey için herhangi bir geçici çözüm?
Manukumar

@Manukumar Kullanım app:srcCompatyerine android:srcve ekleme vectorDrawables.useSupportLibrary = trueiçine defaultConfigsenin build.gradle dosyasının bir parçası. Kitkat emülatöründe iyi çalıştığı test edilmiştir.
android geliştirici

3

Kullanmayın PoterDuff.Mode, kullanın setColorFilter()herkes için çalışır.

ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));

2

@Milosmns'in dediği gibi, imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

Bu API, renk kaynağı kimliği yerine renk değerine ihtiyaç duyuyor.


2

Partiye geç kaldım ama çözümü yukarıda görmedim. Renk tonunu da ayarlayabiliyoruz setImageResource()(minSdkVersion'um 24).

Bu nedenle, önce bir seçici oluşturmanız ve onu /drawablevarlık klasörüne kaydetmeniz gerekir (buna diyorum 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"/>

Sonra kodu şöyle ayarlayın:

val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)

2

Seçiciyi renk tonunuza ayarlamak istiyorsanız:

ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));

0

Renklendirmeyi ayarlamak ve ayarlamak için uzatma işlevini kullanan Kotlin çözümü:

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

-4

Tam cevap değil, daha basit bir alternatif:

  • Görüntünün üstüne başka bir görünüm yerleştirin
  • Değişim alfa istenilen etkiyi elde etmek için (programlı) istediğiniz ancak görüntülemenin değerini.

İşte bunun için bir pasaj:

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

bu renk tonu ile ilgili! saydamlık için alfa değil.
David

Ama bu bir renk tonu gibi davranıyor. Bunu kendiniz denemelisiniz. Bu, şeylere bakmanın sadece bir yoludur.
Shubham Chaudhary

@ShubhamChaudhary Bunun geç olduğunu biliyorum ama görüntü ise png. O zaman arka plan değişmeyecek mi? Ayrıca Alfa ve renk tonu çok farklı. Eğer yanlış değilsem Renk değişimi gibi. Saldırı amaçlı değil. Sadece yardım etmeye çalışıyor :)
KISHORE_ZE

Geçerli nokta. Bu cevap benim durumumda yardımcı oldu. Umut başkasının yerine de uyar.
Shubham Chaudhary
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.