Saya sedang mengedit untuk membuat pertanyaan lebih sederhana, berharap itu membantu menuju jawaban yang akurat.
Katakanlah saya memiliki oval
bentuk berikut :
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:angle="270"
android:color="#FFFF0000"/>
<stroke android:width="3dp"
android:color="#FFAA0055"/>
</shape>
Bagaimana cara mengatur warna secara terprogram, dari dalam kelas aktivitas?
android
android-layout
shape
Cote Mounyo
sumber
sumber
oval
dan merupakan latar belakang dari ImageView.View
kelas, dan menggunakannya sebagaibase
tampilan dalam tata letak yang memungkinkan tumpang tindih widget (RelativeLayout
,FrameLayout
). Di dalamView
kelas yang diperluas ini , Anda bisadraw multiple images onto a canvas
. Tetapi, sebelum melakukan itu, lihat ini -> Tautan (jika Anda belum melakukannya).Jawaban:
Catatan : Jawaban telah diperbarui untuk mencakup skenario di mana
background
merupakan instance dariColorDrawable
. Terima kasih Tyler Pfaff , untuk menunjukkan ini.Dapatkan
Drawable
dariimageView
menggunakangetBackground()
:Periksa terhadap tersangka biasa:
Versi ringkas:
Perhatikan bahwa pemeriksaan nol tidak diperlukan.
Namun, Anda harus menggunakan
mutate()
drawable sebelum mengubahnya jika digunakan di tempat lain. (Secara default, drawable yang diambil dari XML memiliki status yang sama.)sumber
solid
porsi bentuk. Bagaimana denganstroke
porsinya?@username
komentar Anda untuk memastikan pemberitahuan dikirimkan kepada pengguna. Ngomong-ngomong, Anda perlu subkelasShapeDrawable
untuk mengatur porsi goresan. Info lebih lanjut di sini: Tautan . Lihatlah komentar yang menyebutkan masalah dengan jawaban yang diterima.ImageView's
latar belakang Anda diatur keGradientDrawable
,getBackground()
tidak akan mengembalikan aShapeDrawable
. Sebaliknya, gunakanGradientDrawable
yang dikembalikan:GradientDrawable gradientDrawable = (GradientDrawable)imageView.getBackground();
....gradientDrawable.setColors(new int[] { color1, color2 });
.Lakukan seperti ini:
sumber
android:background
xml atau bahkansetBackground
dalam aktivitas Anda sebelum menelepongetBackground()
? Seharusnya berhasil jika Anda melakukannya.Solusi yang lebih sederhana saat ini adalah menggunakan bentuk Anda sebagai latar belakang dan kemudian mengubah warnanya secara terprogram melalui:
Lihat PorterDuff.Mode untuk pilihan yang tersedia.
UPDATE (API 29):
Metode di atas sudah ditinggalkan sejak API 29 dan diganti dengan yang berikut:
Lihat BlendMode untuk opsi yang tersedia.
sumber
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP);
Karena mungkin ada perbatasan di latar belakang atau kurir bulat.getBackground()
panggilan. Imageview.src saya berisi bentuk dan saya menggunakan: diimageIndicator.setColorFilter(toggleColor, PorterDuff.Mode.SRC_ATOP);
manatoggleColor
hanya sebuah int yang sebelumnya menyimpan hasil dari getColor ()PorterDuff.Mode
untukBlendModeColorFilter
tidak akan dikompilasi seperti yang dibutuhkanBlendMode
. Jadi untuk API 29 seharusnyaview.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
.Coba ini:
untuk lebih jelasnya cek tautan ini ini
semoga membantu.
sumber
Semoga ini bisa membantu seseorang dengan masalah yang sama
sumber
gd.setStroke(width_px, Color.parseColor("#FF5722"));
Memperluas jawaban Vikram , jika Anda mewarnai tampilan dinamis, seperti item tampilan pendaur ulang, dll .... Maka Anda mungkin ingin memanggil mutate () sebelum Anda mengatur warna. Jika Anda tidak melakukan ini, tampilan apa pun yang memiliki drawable umum (yaitu latar belakang) juga akan dapat diubah drawable / berwarna.
sumber
if (background instanceof LayerDrawable) { background = ((LayerDrawable) background.mutate()).getDrawable(indexIfLayerDrawable); } if (background instanceof ShapeDrawable)[...]
untuk menangani tata letak latar belakang yang digunakan<layer-list ... <item ...
.Pertanyaan ini dijawab beberapa waktu lalu, tetapi dapat dimodernisasi dengan menulis ulang sebagai fungsi ekstensi kotlin.
sumber
ini adalah solusi yang bekerja untuk saya ... menulisnya di pertanyaan lain juga: Bagaimana cara mengubah warna bentuk secara dinamis?
sumber
Tidak ada yang berhasil untuk saya, tetapi ketika saya mengatur warna warna itu berfungsi pada Shape Drawable
membutuhkan android 5.0 API 21
sumber
Versi fungsi ekstensi Kotlin saya berdasarkan jawaban di atas dengan Compat :
sumber
Cara sederhana untuk mengisi bentuk dengan Radius adalah:
sumber
Mungkin saya terlambat. Tapi jika Anda menggunakan Kotlin. Ada cara seperti ini
Nikmati....
sumber
Bagi siapa pun yang menggunakan C # Xamarin, berikut adalah metode yang didasarkan pada cuplikan Vikram:
sumber