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


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.



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

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

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


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

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


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)

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 .


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

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

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


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

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

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


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!


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>

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

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.


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)

2

Jika Anda ingin mengatur pemilih ke warna Anda:

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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.