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 ...
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 ...
Yanıtlar:
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ü.
android:tint
tüm android sürümlerinde çalışır. Belki de neden bahsediyorsun drawableTint
?
Ç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));
yourTint
Bu 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);
ImageView
AppCompat temalı xml örneklerinde veya AppCompatImageView
alt sınıflarda çalıştığını unutmayın .
Bu benim için çalıştı
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik doğru. Kodunuzdaki diğer hata, XML tanımlı renginize başvurduğunuzda ortaya çıkar. Sen sadece kimliği geçirilen setColorFilter
renk kaynağı bulmak için kimliğini kullanın ve geçmelidir yöntemle, kaynak için setColorFilter
yö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 setColorFilter
yöntemi çok fazla araştırmamış olsam da ...)
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
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 .
imageView.getBackground()
çekilebilir almak zorunda , çünkü imageView.getDrawable()
null dönüyordu.
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)
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
ImageView türündedir .
Basit ve tek satır
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
İ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 :-)
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);
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);
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 :-)
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!
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>
app:srcCompat
yerine android:src
ve ekleme vectorDrawables.useSupportLibrary = true
içine defaultConfig
senin build.gradle dosyasının bir parçası. Kitkat emülatöründe iyi çalıştığı test edilmiştir.
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));
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 /drawable
varlı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)
Seçiciyi renk tonunuza ayarlamak istiyorsanız:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
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))
}
Tam cevap değil, daha basit bir alternatif:
İş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>
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 :)