Bagaimana cara mengatur tint untuk tampilan gambar secara terprogram di android?

397

Perlu mengatur warna untuk tampilan gambar ... Saya menggunakannya dengan cara berikut:

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

Tapi itu tidak berubah ...

Alexander Farber
sumber
15
Anda mungkin menggunakan id sumber daya integer alih-alih nilai warna integer, coba konversi R.color.blue menjadi getResources (). GetColor (R.color.blue)
milosmns
Drawable drawable = ...; drawable.setColorFilter (ContextCompat.getColor (konteks, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (dapat ditarik); // warna apa saja dapat digunakan di sini
flame3

Jawaban:

916

Anda dapat mengubah warna, cukup mudah dalam kode melalui:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint

Jika Anda ingin warna warna itu

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

Untuk Gambar Vektor

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

UPDATE :
@ADev memiliki solusi yang lebih baru dalam jawabannya di sini , tetapi solusinya memerlukan pustaka dukungan yang lebih baru - 25.4.0 atau lebih tinggi.

Hardik
sumber
12
Dalam xml, android: tint = "@ color / blue"
Luis
1
Plus android: tint adalah 21+
androidguy
8
android:tintbekerja di semua versi android. Mungkin Anda sedang berbicara tentang drawableTint?
finstas
11
PorterDuff.Mode.MULTIPLY tidak berfungsi dalam situasi saya, saya menggunakan PorterDuff.Mode.SRC_IN dan berfungsi
Mohamed Nageh
234

Sebagian besar jawaban merujuk pada penggunaan setColorFilteryang bukan apa yang ditanyakan semula.

Pengguna @Tad memiliki jawabannya di arah yang benar tetapi hanya bekerja di API 21+.

Untuk mengatur warna pada semua versi Android, gunakan ImageViewCompat:

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

Perhatikan bahwa yourTintdalam hal ini harus "warna int". Jika Anda memiliki sumber daya warna seperti R.color.blue, Anda harus memuat int warna terlebih dahulu:

ContextCompat.getColor(context, R.color.blue);
ADev
sumber
6
Seharusnya jawaban yang diterima. Perhatikan bahwa ini hanya berfungsi pada ImageViewinstance xml dengan tema AppCompat atau pada AppCompatImageViewsubkelas.
Louis CAD
1
@ADev menghargai solusi Anda tetapi pertanyaannya diajukan pada 2013 dan ImageViewCompat dan AppCompatImageView rilis dengan dukungan v4 lib 25.4.0 pada bulan Juni 2017 dan 25.1.0 Desember 2016 masing-masing :)
Hardik
1
@ADev tentu saja tetapi Anda belum menyebutkan dengan benar dalam jawaban Anda bahwa solusi Anda baru dan memerlukan pustaka dukungan yang lebih baru 25.4.0 dan di atas karena dengan versi lib dukungan yang lebih rendah, kelas ini tidak tersedia sehingga tidak ada yang bisa menemukannya !! !! omong-omong saya edit jawabannya :) selamat siang ...
Hardik
Ini tidak berfungsi pada API 16.
Tayyab Mazhar
49

Ini berhasil untuk saya

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
toobsco42
sumber
ya, bekerja untuk saya juga, tanpa parameter kedua .. itu juga bisamImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad
terbalik dan tanpa parameter kedua, itu berfungsi seperti pesona. Thx @ toobsco42
Ravi Vaniya
35

@Hardik benar. Kesalahan lain dalam kode Anda adalah ketika Anda mereferensikan warna yang ditentukan-XML Anda. Anda hanya meneruskan id ke setColorFiltermetode, saat Anda harus menggunakan ID untuk menemukan sumber daya warna, dan meneruskan sumber ke setColorFiltermetode. Menulis ulang kode asli Anda di bawah ini.

Jika baris ini ada dalam aktivitas Anda:

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

Selain itu, Anda perlu merujuk aktivitas utama Anda:

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

Perhatikan bahwa ini juga berlaku untuk jenis sumber daya lainnya, seperti bilangan bulat, bools, dimensi, dll. Kecuali untuk string, yang dapat Anda gunakan langsung getString()dalam Aktivitas Anda tanpa perlu melakukan panggilan pertama getResources()(jangan tanya kenapa) .

Kalau tidak, kode Anda terlihat bagus. (Meskipun aku belum menyelidiki setColorFiltermetode ini terlalu banyak ...)

CrepeGoat
sumber
22

Setelah saya mencoba semua metode dan mereka tidak berhasil untuk saya.

Saya mendapatkan solusinya dengan menggunakan PortDuff.MODE lain.

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

Dimulai dengan Lollipop, ada juga metode warna untuk BitmapDrawables yang bekerja dengan kelas Palette baru:

kekosongan publik setTintList (warna ColorStateList)

dan

public void setTintMode (PorterDuff.Mode tintMode)

Pada versi Android yang lebih lama, Anda sekarang dapat menggunakan pustaka DrawableCompat

Tad
sumber
2
sebenarnya, perpustakaan dukungan tidak mendukungnya. lihat jawaban saya: stackoverflow.com/a/34479043/878126
pengembang android
13

Fungsi ekstensi yang disederhanakan lebih baik berkat ADev

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

Pemakaian:-

imageView.setTint(R.color.tintColor)
Manohar Reddy
sumber
Apakah ada yang serupa untuk warna teks Tombol / TextView?
pengembang android
maksud Anda warna teks tampilan teks atau warna untuk tampilan teks menggambar?
Manohar Reddy
Maksud saya "warna teks". Warna teks. Tapi saya pikir itu cukup bermasalah, karena teks memiliki warna untuk setiap negara ... Kemudian lagi, bagaimana bisa berfungsi dengan baik ketika saya mengatur warna aksen ... Aneh .... Apakah mungkin untuk mengatur warna aksen ke Tombol tertentu (atau TextView), secara terprogram?
pengembang android
12

Coba ini. Ini harus bekerja pada semua versi Android yang didukung oleh perpustakaan dukungan:

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

Anda dapat menggunakan salah satu di atas untuk membuatnya berfungsi.

Anda dapat membaca tentang fitur yang lebih menarik dari DrawableCompat di dokumen, di sini .

pengembang android
sumber
1
Saya juga harus melakukan imageView.getBackground()untuk mendapatkan drawable, karena imageView.getDrawable()mengembalikan nol.
Rock Lee
@ RockLee pastikan bahwa Anda menggunakan src dalam tampilan gambar xml atau setImageResource dalam kode
orelzion
ini adalah cara sempurna untuk mengatur warna warna untuk latar belakang tampilan gambar
leegor
11

Jika warna Anda memiliki transparansi hex, gunakan kode di bawah ini.

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

Untuk menghapus warna

ImageViewCompat.setImageTintList(imageView, null);
Sai
sumber
apa itu tipe "img"
Beyaz
1
@Beyaz imgadalah tipe ImageView.
Sai
10

Sederhana dan satu baris

imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
Gautam Surani
sumber
9

Karena jawaban pertama tidak berhasil untuk saya:

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

Ini sepertinya hanya berfungsi di API 21+, tetapi bagi saya itu bukan masalah. Anda dapat menggunakan ImageViewCompat untuk menyelesaikan masalah itu, tho.

Saya harap saya membantu siapa pun :-)

Felix
sumber
7

Mulai di Lollipop, ada metode yang disebut ImageView#setImageTintList()bahwa Anda dapat menggunakan ... keuntungannya karena dibutuhkan ColorStateListsebagai lawan hanya satu warna, sehingga membuat warna gambar menjadi sadar.

Pada perangkat pra-Lollipop, Anda bisa mendapatkan perilaku yang sama dengan mewarnai drawable dan kemudian mengaturnya sebagai ImageViewdrawable gambar:

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);
Alex Lockwood
sumber
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);
Pawan asati
sumber
6

Untuk mengatur warna untuk tampilan gambar secara terprogram di android

Saya punya dua metode untuk android:

1)

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

2)

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

Saya harap saya membantu siapa pun :-)

Abhign01
sumber
4

Menambah Adev 's jawaban (yang menurut saya adalah yang paling benar), karena adopsi Kotlin, dan fungsi ekstensi yang berguna:

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

Saya pikir ini adalah fungsi yang bisa berguna untuk ada di proyek Android mana pun!

Cillian Myles
sumber
4

Saya menemukan bahwa kita dapat menggunakan pemilih warna untuk warna awal:

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>
NickUnuchek
sumber
Hai, Ini tidak berfungsi untuk digambar vektor .. Ada solusi yang sama?
Manukumar
@Manukumar Gunakan app:srcCompatalih-alih android:src, dan tambahkan vectorDrawables.useSupportLibrary = trueke defaultConfigbagian file build.gradle Anda. Diuji bekerja dengan baik pada emulator Kitkat.
pengembang android
3

Jangan gunakan PoterDuff.Mode, Gunakan setColorFilter()itu berfungsi untuk semua.

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

Seperti yang dikatakan @milosmns, Anda harus menggunakan imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

API ini membutuhkan nilai warna alih-alih id sumber daya warna, Itulah penyebab utama mengapa pernyataan Anda tidak berfungsi.

HunkD
sumber
2

Saya terlambat ke pesta tetapi saya tidak melihat solusi saya di atas. Kami juga dapat mengatur warna warna setImageResource()(minSdkVersion saya adalah 24).

Jadi, pertama, Anda perlu membuat pemilih dan menyimpannya di /drawablefolder aset (saya menyebutnya 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"/>

Kemudian atur dalam kode seperti ini:

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

Jika Anda ingin mengatur pemilih ke warna Anda:

ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
Yusril Maulidan Raji
sumber
0

Solusi Kotlin menggunakan fungsi ekstensi, untuk mengatur dan menghapus pewarnaan:

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))
}
pengembang android
sumber
-4

Bukan jawaban yang pasti tetapi alternatif yang lebih sederhana:

  • Tempatkan tampilan lain di atas gambar
  • Ubah nilai alfa tampilan sesuai keinginan Anda (secara terprogram) untuk mendapatkan efek yang diinginkan.

Berikut ini cuplikannya:

<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>
Shubham Chaudhary
sumber
ini tentang warna! bukan alpha yang untuk transparansi.
David
Tapi itu akhirnya bertindak sebagai warna. Anda harus mencobanya sendiri. Ini hanya satu cara untuk melihat berbagai hal.
Shubham Chaudhary
@ ShubhamChaudhary Saya tahu ini terlambat tapi bagaimana jika gambarnya png. Maka bukankah latar belakang akan berubah? Juga alfa dan rona sangat berbeda. Warna Seperti penggantian warna, jika saya tidak salah. Tidak ada pelanggaran yang dimaksudkan. Hanya berusaha membantu :)
KISHORE_ZE
Poin yang valid. Jawaban ini membantu dalam kasus saya. Harapan juga cocok dengan sepatu orang lain.
Shubham Chaudhary