Android में प्रोग्राम व्यू के लिए टिंट कैसे सेट करें?


396

एक छवि दृश्य के लिए टिंट सेट करने की आवश्यकता है ... मैं इसे निम्नलिखित तरीके से उपयोग कर रहा हूं:

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

लेकिन यह नहीं बदलता है ...


15
आपने पूर्णांक रंग मान के बजाय पूर्णांक संसाधन आईडी का उपयोग किया हो सकता है, R.color.blue को प्राप्त स्रोतों () में परिवर्तित करने का प्रयास करें। getColor (R.color.blue)
milosmns

आकृष्ट करने योग्य drawable = ...; drawable.setColorFilter (ContextCompat.getColor (संदर्भ, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (drawable); // यहाँ किसी भी रंग का उपयोग किया जा सकता है
लौ 3

जवाबों:


915

आप आसानी से कोड में टिंट को बदल सकते हैं:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // सफेद टिंट

अगर आपको कलर टिंट चाहिए

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

वेक्टर ड्रा के लिए

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

अद्यतन करें :
@ADev के पास अपने उत्तर में नया समाधान है , लेकिन उसके समाधान के लिए नए समर्थन पुस्तकालय - 25.4.0 या इसके बाद के संस्करण की आवश्यकता है।



12
Xml में, एंड्रॉइड: टिंट = "@ रंग / नीला"
लुइस

1
प्लस एंड्रॉइड: टिंट 21+
androidguy

8
android:tintसभी Android संस्करणों पर काम करता है। शायद आप बात कर रहे हैं drawableTint?
फिनस्टैस

11
PorterDuff.Mode.MULTIPLY मेरी स्थिति में काम नहीं करता है मैंने PorterDuff.Mode.SRC_IN का उपयोग किया है और यह काम करता है
मोहम्मद नगेह

234

अधिकांश उत्तर का उपयोग करने का संदर्भ है setColorFilterजो मूल रूप से नहीं पूछा गया था।

उपयोगकर्ता @Tad का उत्तर सही दिशा में है, लेकिन यह केवल API 21+ पर काम करता है।

सभी Android संस्करणों पर टिंट सेट करने के लिए, ImageViewCompatनिम्न का उपयोग करें :

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

ध्यान दें कि yourTintइस मामले में "रंग इंट" होना चाहिए। यदि आपके पास एक रंग संसाधन है R.color.blue, तो आपको पहले रंग को लोड करना होगा:

ContextCompat.getColor(context, R.color.blue);

6
स्वीकृत उत्तर होना चाहिए। ध्यान दें कि यह केवल ImageViewAppCompat विषय के साथ या AppCompatImageViewउपवर्गों पर xml इंस्टेंस पर काम करता है ।
लुई सीएडी

1
@ADev ने आपके समाधान की सराहना की, लेकिन सवाल 2013 में पूछा गया था और ImageViewCompat और AppCompatImageView ने जून 2017 में v4 के समर्थन में 25.4.0 और क्रमशः 25.1.0 दिसंबर 2016 को जारी किया :)
हार्दिक

1
@ निश्चित रूप से, लेकिन आपने अपने उत्तर में यह ठीक से उल्लेख नहीं किया है कि आपका समाधान नया है और नए समर्थन पुस्तकालय की आवश्यकता है 25.4.0 और इसके बाद के संस्करण क्योंकि समर्थन के कम संस्करण के साथ यह वर्ग उपलब्ध नहीं है, इसलिए कोई भी इसे ढूंढ नहीं सका !! !! वैसे मैंने जवाब दिया :) अच्छा दिन ...
हार्दिक

यह एपीआई 16 पर काम नहीं कर रहा है।
तैयब मजहर

49

इसने मेरे लिए काम किया

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));

हाँ, मेरे लिए भी काम किया, दूसरे पैरामीटर के बिना .. यह भी जा सकता हैmImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
बिस्क्रेम मुहम्मद

उत्कीर्ण और दूसरे पैरामीटर के बिना, यह आकर्षण की तरह काम करता है। Thx @ toobsco42
रवि वानिया

35

@ हार्दिक के पास यह अधिकार है। आपके कोड में अन्य त्रुटि तब होती है जब आप अपने एक्सएमएल-परिभाषित रंग का संदर्भ देते हैं। आपने setColorFilterविधि को केवल आईडी पास किया , जब आपको रंग संसाधन का पता लगाने के लिए आईडी का उपयोग करना चाहिए, और संसाधन को setColorFilterविधि को पास करना चाहिए । नीचे अपने मूल कोड को फिर से लिखना।

यदि यह रेखा आपकी गतिविधि के भीतर है:

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

और, आपको अपनी मुख्य गतिविधि का संदर्भ देना होगा:

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

ध्यान दें कि यह स्ट्रिंग के अलावा अन्य प्रकार के संसाधनों, जैसे पूर्णांक, बूल, आयाम आदि के बारे में भी सच है, जिसके लिए आप getString()पहली कॉल करने की आवश्यकता के बिना सीधे अपनी गतिविधि में उपयोग कर सकते हैं getResources()(मुझसे पूछें क्यों नहीं) ।

अन्यथा, आपका कोड अच्छा लग रहा है। (हालांकि मैंने इस setColorFilterविधि की बहुत अधिक जांच नहीं की है ...)


22

के बाद मैं सभी तरीकों की कोशिश की और वे मेरे लिए काम नहीं किया।

मैं एक और PortDuff.MODE का उपयोग करके समाधान प्राप्त करता हूं।

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

14

लॉलीपॉप से ​​शुरुआत करते हुए, बिटमैपड्रैबल्स के लिए एक टिंट विधि भी है जो नए पैलेट वर्ग के साथ काम करती है:

सार्वजनिक शून्य setTintList (ColorStateList टिंट)

तथा

सार्वजनिक शून्य सेटटिंटमोड (पोर्टरडफ.मोड टिंटमोड)

Android के पुराने संस्करणों पर, आप अब ड्राएबल.कॉम लाइब्रेरी का उपयोग कर सकते हैं


2
वास्तव में, समर्थन पुस्तकालय इसका समर्थन करता है। मेरा जवाब देखें: stackoverflow.com/a/34479043/878126
android डेवलपर

12

इसे इस्तेमाल करे। यह सभी एंड्रॉइड संस्करणों पर काम करना चाहिए जो समर्थन पुस्तकालय का समर्थन करता है:

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

आप इसे काम करने के लिए उपरोक्त में से किसी का उपयोग कर सकते हैं।

आप डॉक्स के बारे में अधिक रोचक विशेषताओं के बारे में डॉक्स पर पढ़ सकते हैं, यहां


1
मुझे imageView.getBackground()ड्रॉ करने योग्य होने के लिए भी करना पड़ा , क्योंकि imageView.getDrawable()वह अशक्त लौट रहा था।
रॉक ली

@RockLee सुनिश्चित करें कि आपने कोड में छवि दृश्य xml या setImageResource में src का उपयोग किया है
orelzion

यह इमेजव्यू बैकग्राउंड के लिए टिंट कलर सेट करने का सही तरीका है
leegor

12

ADev के लिए बेहतर सरलीकृत विस्तार समारोह धन्यवाद

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

उपयोग: -

imageView.setTint(R.color.tintColor)

क्या बटन के / TextView के पाठ टिंट के लिए एक समान है?
एंड्रॉइड डेवलपर

क्या आपका मतलब है कि टेक्स्टव्यू ड्रा के लिए टेक्स्टव्यू कलर या टिंट?
मनोहर रेड्डी

मेरा मतलब है "पाठ टिंट"। पाठ का रंग। लेकिन मुझे लगता है कि यह काफी समस्याग्रस्त है, क्योंकि पाठ में प्रत्येक राज्य के लिए एक रंग होता है ... फिर, फिर से कैसे यह ठीक काम करता है जब मैं उच्चारण रंग सेट करता हूं ... अजीब .... क्या यह संभव है कि उच्चारण रंग सेट करना एक विशिष्ट बटन (या TextView), प्रोग्रामेटिक रूप से?
Android डेवलपर

11

यदि आपके रंग में हेक्स पारदर्शिता है, तो नीचे दिए गए कोड का उपयोग करें।

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

टिंट साफ़ करने के लिए

ImageViewCompat.setImageTintList(imageView, null);

"img" का प्रकार क्या है
Beyaz

1
@Beyaz imgImageView का प्रकार है।
साईं


9

पहले जवाब के रूप में मेरे लिए काम नहीं किया:

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

यह केवल एपीआई 21+ में काम करता है, लेकिन मेरे लिए यह एक मुद्दा नहीं था। आप उस समस्या को हल करने के लिए एक ImageViewCompat का उपयोग कर सकते हैं, थ।

मुझे आशा है कि मैंने किसी की मदद की :-)


7

लॉलीपॉप में शुरुआत, एक ऐसी विधि है जिसे ImageView#setImageTintList()आप उपयोग कर सकते हैं ... इसका फायदा यह है कि यह ColorStateListकेवल एक रंग के विपरीत है, इस प्रकार छवि की टिंट स्थिति को जागरूक करता है।

प्री-लॉलीपॉप डिवाइसों पर, आप ड्रॉबल को टिन करके और फिर इसे ड्रॉअर ड्रॉअर के रूप में सेट करके समान व्यवहार प्राप्त कर सकते हैं ImageView:

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

Android में प्रोग्राम छवि के लिए सेट टिंट के लिए

मेरे पास Android के लिए दो तरीके हैं:

1)

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

2)

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

मुझे आशा है कि मैंने किसी की मदद की :-)


4

Kotev के व्यापक रूप से गोद लेने और इसके उपयोगी विस्तार कार्यों के बाद से ADev के उत्तर (जो मेरी राय में सबसे सही है) को जोड़ना :

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

मुझे लगता है कि यह एक फ़ंक्शन है जो किसी भी एंड्रॉइड प्रोजेक्ट में होना उपयोगी हो सकता है!


4

मैंने पाया कि हम रंग चयनकर्ता का उपयोग टिंट एटर के लिए कर सकते हैं:

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>

नमस्ते, यह वेक्टर चित्र के लिए काम नहीं कर रहा है..एक ही के लिए वैकल्पिक हल?
मनुकुमार

@Manukumar app:srcCompatइसके बजाय का उपयोग करें android:src, और अपने build.gradle फ़ाइल vectorDrawables.useSupportLibrary = trueके defaultConfigहिस्से में जोड़ें । किटकैट एमुलेटर पर ठीक काम करने के लिए परीक्षण किया गया।
एंड्रॉइड डेवलपर

3

उपयोग न करें PoterDuff.Mode, setColorFilter()इसका उपयोग करें यह सभी के लिए काम करता है।

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

2

जैसा कि @milosmns ने कहा, आपको उपयोग करना चाहिए imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

इस API को कलर रिसोर्स आईडी के बजाय कलर वैल्यू चाहिए, यही मूल कारण है कि आपका स्टेटमेंट काम नहीं आया।


2

मुझे पार्टी में देर हो रही है लेकिन मैंने ऊपर अपना सॉल्यूशन नहीं देखा। हम के माध्यम से रंग रंग सेट करने में सक्षम हैं setImageResource(), भी (मेरे minSdkVersion 24 है)।

तो, सबसे पहले, आपको एक चयनकर्ता बनाने और इसे /drawableसंपत्ति फ़ोल्डर में सहेजने की आवश्यकता है (मैं इसे कॉल करता हूं 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"/>

फिर इसे इस तरह कोड में सेट करें:

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


0

विस्तार समारोह का उपयोग कर कोटलिन समाधान, टिन्टिंग को सेट और परेशान करने के लिए:

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

सटीक उत्तर नहीं बल्कि एक सरल विकल्प:

  • छवि के शीर्ष पर एक और दृश्य रखें
  • इच्छित प्रभाव प्राप्त करने के लिए (प्रोग्रामेटिक रूप से) हालांकि, दृश्य के अल्फ़ा मान को बदलें ।

यहाँ इसके लिए एक स्निपेट दिया गया है:

<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। तब पृष्ठभूमि नहीं बदलेगी? इसके अलावा अल्फा और टिंट बहुत अलग हैं। टिंट रंग बदलने की तरह है, अगर मैं गलत नहीं हूं। कोई अपराध नहीं। बस मदद करने की कोशिश कर रहा है :)
KISHORE_ZE

वैध बिंदु। इस जवाब से मेरे मामले में मदद मिली। आशा है कि किसी और के जूते भी फिट बैठता है।
शुभम चौधरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.