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 ...
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 ...
Jawaban:
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.
android:tint
bekerja di semua versi android. Mungkin Anda sedang berbicara tentang drawableTint
?
Sebagian besar jawaban merujuk pada penggunaan setColorFilter
yang 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 yourTint
dalam 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);
ImageView
instance xml dengan tema AppCompat atau pada AppCompatImageView
subkelas.
Ini berhasil untuk saya
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik benar. Kesalahan lain dalam kode Anda adalah ketika Anda mereferensikan warna yang ditentukan-XML Anda. Anda hanya meneruskan id ke setColorFilter
metode, saat Anda harus menggunakan ID untuk menemukan sumber daya warna, dan meneruskan sumber ke setColorFilter
metode. 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 setColorFilter
metode ini terlalu banyak ...)
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
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)
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 .
imageView.getBackground()
untuk mendapatkan drawable, karena imageView.getDrawable()
mengembalikan nol.
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);
img
adalah tipe ImageView.
Sederhana dan satu baris
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
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 :-)
Mulai di Lollipop, ada metode yang disebut ImageView#setImageTintList()
bahwa Anda dapat menggunakan ... keuntungannya karena dibutuhkan ColorStateList
sebagai 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 ImageView
drawable gambar:
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);
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 :-)
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!
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>
app:srcCompat
alih-alih android:src
, dan tambahkan vectorDrawables.useSupportLibrary = true
ke defaultConfig
bagian file build.gradle Anda. Diuji bekerja dengan baik pada emulator Kitkat.
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));
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.
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 /drawable
folder 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)
Jika Anda ingin mengatur pemilih ke warna Anda:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
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))
}
Bukan jawaban yang pasti tetapi alternatif yang lebih sederhana:
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>
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 :)