आपी के लिए ड्रा करने योग्य टिनटिंग <21


84

क्या यह एपि <21 के लिए ड्रा करने योग्य टिनिंग कार्य करना संभव है?

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary" />

सिर्फ ठीक काम करता है लेकिन केवल API21 वाले उपकरणों के लिए। कम एपीआई उपकरणों या AppCompat समर्थन के लिए कोई समाधान? कुछ भी नहीं मिल रहा।

जवाबों:


106

इस AppCompatImageViewतरह का उपयोग करें :

<android.support.v7.widget.AppCompatImageView
        android:id="@+id/my_appcompat_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_image"
        android:tint="#636363"
    />

सुनिश्चित करें कि आपके पास appcompat-v7अपने ऐप में नवीनतम है build.gradle।

उदाहरण: compile 'com.android.support:appcompat-v7:25.0.0'आपके ऐप में build.gradle।


66
से AppCompatImageViewडॉक्स: This will automatically be used when you use ImageView in your layouts. You should only need to manually use this class when writing custom views. developer.android.com/reference/android/support/v7/widget/... तो, सामान्य का उपयोग कर ImageViewलेआउट में ठीक काम करना चाहिए।
— निम्रोद दयाण

1
जैसा कि @NimrodDayan ऊपर उल्लेख किया गया है, यह आवश्यक नहीं होना चाहिए। मुझे Android की रिपोर्ट मिल रही है: सैमसंग A5 और मोटो G पर काम नहीं कर रहा है, हालाँकि (appcompat-v7: 23.4.0 का उपयोग करके), इसलिए यह संभव है कि कुछ उपकरणों पर ImageView ठीक से प्रतिस्थापित नहीं किए जा रहे हैं।
— स्टीफन किड्सन

@StephenKidson, मैं appcompat के एक ही संस्करण का उपयोग कर रहा हूं और एक अज्ञात ब्रांड डिवाइस पर एक ही मुद्दे में टकरा भी रहा हूं। क्या आपने इसे हल करने का प्रबंधन किया? मुझे आश्चर्य है कि अगर वहाँ बग इस बारे में सूचना दी है ...
— निम्रोद दयान

4
यह ऐपकॉम-वी 7: 25.1.0 का उपयोग करके एमुलेटर एंड्रॉइड 4.0 पर काम नहीं करता था।
— पीटरडक

4
AppCompatImageView का उपयोग विजेट के अंदर नहीं किया जा सकता है। ImageView पर setColorFilter का उपयोग करें।
— मैसिमो

46

आप स्रोत कोड का उपयोग करके प्राप्त कर सकते हैं। पहले टिनिंग का समर्थन नहीं किया गया था DrawableCompat। समर्थन पुस्तकालय से शुरू 22.1 आप ऐसा कर सकते हैं, लेकिन आपको इसे इस तरह से करने की आवश्यकता है:

Drawable normalDrawable = getResources().getDrawable(R.drawable.drawable_to_tint);
Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
DrawableCompat.setTint(wrapDrawable, getResources().getColor(R.color.colorPrimaryLight));

18
यदि आपको <21 एपीआई पर टिनिंग का समर्थन करने की आवश्यकता है, तो आप संभवतः ContextCompat.getColor()इसके बजाय का उपयोग करना चाहते हैं getResources().getColor()।
— सेवस्तन सवण्युक

22

क्या आप अपना ड्रॉबल प्रदर्शित करने के लिए बस एक ImageView का उपयोग नहीं कर सकते थे? android:tintपुराने API स्तरों पर ठीक काम करता है।

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary"
    />

2
मैं ImageView का उपयोग कर रहा हूं - इसमें आइकन प्रदर्शित करने के लिए। वे आइकन मेरे नेविगेशन दराज में तत्वों का हिस्सा हैं। और नेविगेशन ड्रॉअर में चयनित आइटम का रंग अलग है, इसलिए मैंने प्रत्येक आइकन को टिंट किया और प्रत्येक आइकन के लिए चयनकर्ता भी। और मैं अपने आइकॉन के लिए उस चयनकर्ता का उपयोग कर रहा हूं। चयनकर्ता:<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@drawable/ic_home_tinted" /> <item android:drawable="@drawable/ic_home" /> </selector>
— MaTTo

@ ओरोची मेरे उत्तर पर एक नज़र डालें क्योंकि यह सीधे Google के ब्लॉग से आता है। यह मुख्य रूप से केवल एंड्रॉइड 5.0+ पर काम करता है, लेकिन प्री-एंड्रॉइड 5.0 चलाने वाले उपकरणों के लिए कुछ विजेट पर काम कर सकता है।
— जेरेड बुरोज

@ ओरोची आपको उसी प्रभाव को "अनुकरण" करने के लिए कस्टम दृश्य बनाने होंगे।
— जेरेड बुरोज

1
आप एक छवि दृश्य का उपयोग कर सकते हैं, आइकन को यथासंभव सफेद बना सकते हैं, और इसे किसी भी रंग से बना सकते हैं जिसे आप iv.setColorFilter (yourColor, Mode.Multiply) के साथ चाहते हैं; सुनिश्चित करें कि आप android.graphics.PorterDuff.Mode
— jb15613

3
यहां भी यही समस्या। दुख की बात है कि चयनकर्ता के साथ टिंट
— एपि

17

इसी तरह का एक प्रश्न यहाँ से पहले पूछा गया है: https://stackoverflow.com/a/26533340/950427

Android ड्रा करने योग्य टिनटिंग केवल Android 5.0+ (API 21+) में समर्थित है। (यह " At the moment this is limited to coloring the action bar and some widgets." कहता है )।

थीम

...

जब आप इन विशेषताओं को सेट करते हैं, AppCompat स्वचालित रूप से API 21+ पर फ्रेमवर्क विशेषताओं के लिए अपने मूल्यों का प्रचार करता है। यह स्वचालित रूप से स्टेटस बार और ओवरव्यू (Recents) कार्य प्रविष्टि को रंग देता है।

पुराने प्लेटफॉर्म्स पर, AppCompat जहाँ संभव हो, कलर थीमिंग का अनुकरण करता है। फिलहाल यह एक्शन बार और कुछ विजेट्स को कलर करने तक सीमित है।

तथा

विजेट टिनिंग

जब एंड्रॉइड 5.0 के साथ उपकरणों पर चल रहा है, तो सभी विजेट रंग थीम विशेषताओं का उपयोग करके रंगा हुआ है, जिनके बारे में हमने अभी बात की है।दो मुख्य विशेषताएं हैं जो लॉलीपॉप पर इसकी अनुमति देती हैं: ड्रॉबल में ड्रिबल टिनटिंग, और रेफरेंसिंग थीम एट्रीब्यूट्स (फॉर्म? Attr / foo)।

AppCompat UI विजेट के सबसेट के लिए Android के पुराने संस्करणों पर समान व्यवहार प्रदान करता है:

AppCompat के टूलबार (एक्शन मोड्स, आदि) द्वारा प्रदत्त सब कुछ EditText Spinner CheckBox RadioButton Switch (नए android.support.v7.widget.SwitchCompat का उपयोग करें) CheckedTextView आपको इन कामों को करने के लिए कुछ विशेष करने की आवश्यकता नहीं है, बस इन नियंत्रणों का उपयोग करें हमेशा की तरह आपके लेआउट और AppCompat बाकी काम करेंगे (कुछ कैविट्स के साथ; नीचे FAQ देखें)।

सूत्रों का कहना है:

http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

https://chris.banes.me/2014/10/17/appcompat-v21/


इसे क्यों ठुकरा दिया गया? यह आधिकारिक दस्तावेज से है।
— जेरेड बरो 19

उत्तर पुराना है। ImageViewअब android:tint@ जोनीक के उत्तर के रूप में, AppCompat के माध्यम से भी समर्थन करता है ।
— विक्की चिजवानी

@VickyChijwani एक संपादन सबमिट करें। और तुम्हारा मतलब है AppCompatImageView, नहीं ImageView।
— जेरेड बुरो

13

अब AppCompatImageView, AppCompatButton लो एपीआई वाले उपकरणों पर टिंट का समर्थन करने के लिए ImageView, बटन को बदल देगा। अधिक जानकारी के लिए लिंक की जाँच करें AppCompatImageView , AppCompatButton


6

चित्रों का उपयोग करने के लिए imageView.setColorFilter(int color)। यह एपीआई 8 से काम करता है और मेरी काली छवि को मेरे इच्छित रंग में टिन्ट करने के लिए काम करता है। यह बदल सकता है, setImageTintList()लेकिन सिर्फ android:tintकाम करना भी काम करना चाहिए।


4

इस NameSpace
xmlns का उपयोग करें : app = "http://schemas.android.com/apk/res-auto"

और जब आप हर एंड्रॉइड को बदल सकते हैं: एप्लिकेशन के साथ टिंट: टिंट। यह मेरे लिए समस्या को हल करता है।


4

मुझे थोड़ी देर हो गई है लेकिन यहाँ यह कैसे करना है।

val textInput = EditText(context)

val drawable = ContextCompat.getDrawable(context, R.drawable.your_drawable)
drawable?.let {
    myDrawable -> DrawableCompat.setTint(myDrawable, ContextCompat.getColor(context, R.color.your_color))
    textInput.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, myDrawable, null)
}

1

जैसा आप चाहते हैं वैसा ही करेंगे, और समर्थन लाइब्रेरी के सभी Android संस्करणों पर काम करना चाहिए:

@JvmStatic
fun getTintedDrawable(inputDrawable: Drawable, @ColorInt color: Int): Drawable {
    val wrapDrawable = DrawableCompat.wrap(inputDrawable.mutate())
    DrawableCompat.setTint(wrapDrawable, color)
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN)
    return wrapDrawable
}

1

अगर किसी को नया ड्रॉबल (टिन 1, टिन्ट 2 ..) बनाना है तो यह कोशिश करें

<?xml version="1.0" encoding="utf-8"?>
<bitmap
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:src="@drawable/your_image"
  android:tint="@color/tint_color">
   </bitmap>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.