प्रोग्राम योग्य रंग बदलें


139

मैं कोड द्वारा एक सफेद मार्कर छवि पर रंग बदलने की कोशिश कर रहा हूं। मैंने पढ़ा है कि नीचे दिए गए कोड को रंग बदलना चाहिए, लेकिन मेरा मार्कर सफेद रहता है।

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

क्या मैं कुछ भुल गया? क्या मेरे रेज फोल्डर में स्थित ड्रॉबल्स पर रंग बदलने का कोई और तरीका है?


स्वीकार किए गए उत्तर ने मेरे लिए काम नहीं किया..इससे कैसे उत्तर दें [1], [1]: stackoverflow.com/questions/5940825/…
sham.y

मुझे लगता है कि यहां सभी उत्तर पृष्ठभूमि का रंग बदलते हैं, लेकिन छवि का रंग नहीं। क्या मैं सही हूं? क्या कोई मुझे बता सकता है? मैंने यहां सभी समाधानों की कोशिश की और स्टैकओवरफ्लो पर भी समान प्रश्नों पर, लेकिन वे केवल मामले में पृष्ठभूमि का रंग बदल सकते हैं। इसलिए मुझे लगता है, हम केवल पृष्ठभूमि का रंग बदल सकते हैं, लेकिन छवियों का रंग नहीं। क्या मैं सही हूँ?
शिरीष हर्वाडे

जवाबों:


258

इसे इस्तेमाल करे:

Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable); 
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);    

उपयोग करना DrawableCompatमहत्वपूर्ण है क्योंकि यह एपीआई 22 उपकरणों और इससे पहले के बैकवर्ड संगतता और बग फिक्स प्रदान करता है।


हम्म, रंग सफेद रहता है। क्या यह हेलो मैपव्यू OverlayItemsक्लास के साथ हो सकता है जो समस्या का कारण हो सकता है? यह मेरे Res फ़ोल्डर से एक नियमित रूप से उल्लेखनीय है, कुछ खास नहीं ...
जोहान

तो क्या उपाय था?
स्पीडिनोमैड्स

@ ρя.ρєяK आप बहुत ही शानदार हैं। हर कोई मददगार है
लुट्टू एंड्रॉइड

30
यदि आप चाहते हैं कि आप स्रोत रंगों की एक विस्तृत श्रृंखला के साथ काम करना चाहें तो PorterDuff.Mode.SRC_IN पसंद कर सकते हैं।
लोर्ने लालबेटे

1
पोर्टरडफेलकॉन्फिल्टर कंस्ट्रक्टर ARGB रंग प्रारूप
रिचएक्स

124

आप इस svg वेक्टर drawable के लिए कोशिश कर सकते हैं

DrawableCompat.setTint(
    DrawableCompat.wrap(myImageView.getDrawable()),
    ContextCompat.getColor(context, R.color.another_nice_color)
);

4
सबसे अच्छा तरीका है जो मैंने svg के लिए देखा है।
apSTRK

1
इसे स्वीकार किए गए उत्तर पर पसंद करें, हालांकि दोनों काम करेंगे, लेकिन इस एक के साथ मुझे इस बारे में चिंता करने की ज़रूरत नहीं है कि क्या सेट करने योग्य है, मैं बस पहले से ही वहां मिलता हूं, और यह भी पिछड़े संगत, महान है!
RJFares

1
सबसे अच्छा जवाब जब कुछ भी नहीं एक आकर्षण की तरह काम किया! आपका बहुत बहुत धन्यवाद! ध्यान दें: यह तब भी काम करता है जब आप अपने इमेज व्यू / AppCompatImageView में xml ड्रॉ करने योग्य होते हैं
Sjd

1
इसे प्रोग्रामेटिक रूप से कैसे निकालें?
हार्दिक जोशी

1
@HardikJoshi प्रलेखन कहते हैं: टिंट साफ़ करने के लिए, पारित nullकरने के लिएDrawable#setTintList(ColorStateList)
arekolek

23

आपको ड्रॉबल पर म्यूट () कॉल करने की आवश्यकता हो सकती है अन्यथा सभी आइकन प्रभावित होते हैं।

Drawable icon = ContextCompat.getDrawable(getContext(), R.drawable.ic_my_icon).mutate();
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorIcon, typedValue, true);
icon.setColorFilter(typedValue.data, PorterDuff.Mode.SRC_ATOP);

21

लॉलीपॉप, एंड्रॉइड 5. पर ऐसा करने का एक और तरीका है जैसे कि बिटमैप पर एक टिंट सेट करना जैसे कि:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_back"
    android:tint="@color/red_tint"/>

यह आपके लिए काम करेगा यदि आपके पास सीमित संख्या में रंग हैं जिन्हें आप अपने ड्रॉइंग पर उपयोग करना चाहते हैं। अधिक जानकारी के लिए मेरी ब्लॉग पोस्ट देखें


2
अच्छा! Btw, यह प्री-लॉलीपॉप पर भी ठीक काम करता है। (बस इसके साथ minSdkVersion 16और एंड्रॉइड 4.1.1 डिवाइस के साथ इसका परीक्षण किया गया ।)
जोनिक

इस तरह से एक बिटमैप बनाते समय, यह लेआउट को फिट करने के लिए खिंचाव नहीं करता है क्योंकि यह उपयोग करते समय होता है android:background="..."। बहुत अजीब है!
प्रिंस

मुझे लगता है कि क्योंकि आप यहां एक नौ पैच नहीं बना रहे हैं।
मिंसमैन

क्षमा करें, यह पृष्ठ मौजूद नहीं है = (
फान वन लिन्ह

@ जेनिक आपके दिए गए प्रश्न के उत्तर अप्रासंगिक हैं। यह सवाल ड्रा करने योग्य के रंग को बदलने का तरीका पूछ रहा है , न कि इमेज व्यू।
एंटनी।

19

इसके लिए आप कोशिश कर सकते हैं ImageView। का उपयोग कर setColorFilter()

imageViewIcon.setColorFilter(ContextCompat.getColor(context, R.color.colorWhite));

10

मैंने एक जेनेरिक फ़ंक्शन लिखा है जिसमें आप संदर्भ दे सकते हैं, आइकॉन आईडी ड्रॉएबल / मिपमैप इमेज आइकन और नया रंग है जो आपको उस आइकन के लिए चाहिए।

यह फ़ंक्शन ड्रॉबल देता है।

public static Drawable changeDrawableColor(Context context,int icon, int newColor) {
    Drawable mDrawable = ContextCompat.getDrawable(context, icon).mutate(); 
    mDrawable.setColorFilter(new PorterDuffColorFilter(newColor, PorterDuff.Mode.SRC_IN)); 
    return mDrawable;
} 

changeDrawableColor(getContext(),R.mipmap.ic_action_tune, Color.WHITE);

9

आप एक ColorMatrixColorFilter की कोशिश कर सकते हैं, क्योंकि आपका मुख्य रंग सफेद है:

// Assuming "color" is your target color
float r = Color.red(color) / 255f;
float g = Color.green(color) / 255f;
float b = Color.blue(color) / 255f;

ColorMatrix cm = new ColorMatrix(new float[] {
        // Change red channel
        r, 0, 0, 0, 0,
        // Change green channel
        0, g, 0, 0, 0,
        // Change blue channel
        0, 0, b, 0, 0,
        // Keep alpha channel
        0, 0, 0, 1, 0,
});
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
myDrawable.setColorFilter(cf);

7

इसने मेरे लिए काम किया। 0x और कलर कोड के बीच "ff" डालना सुनिश्चित करें। इस तरह 0xff2196F3

Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
                    mDrawable.setColorFilter(new
                            PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));

नमस्ते @ स्टैकओवरफ़्लो में आपका स्वागत है। यदि यह आपके लिए काम करता है, तो यह दिखाने के लिए न्यूनतम समाधान के साथ एक jsfiddle को शामिल करना बहुत उपयोगी होगा। यह उस व्यक्ति की मदद करेगा जिसने प्रश्न को ठीक से समझने के लिए पोस्ट किया है।
अर्जुन चौधरी

6

स्वीकृत उत्तर के रूप में भी, लेकिन एक सरल सुविधा विधि:

val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)

ध्यान दें, यहाँ कोड Kotlin है।


3

आप कोशिश Mode.LIGHTENकर सकते हैं या Mode.DARKEN। Android Javadocs, पोर्टरडफ मोड्स क्या करते हैं, यह समझाने में भयानक हैं। आप उन्हें यहाँ देख सकते हैं: पोर्टरडफ | एंड्रॉयड

मेरा सुझाव है कि यहां मोजिला की साइट पर कंपोजिटिंग देखें (उनके पास सभी तरीके नहीं हैं जो एंड्रॉइड करता है लेकिन उनके पास बहुत सारे हैं)


3

इसका उपयोग करें: जावा के लिए

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)

कोटलिन के लिए

view.background.setColorFilter(Color.parseColor("#343434"),PorterDuff.Mode.SRC_OVER)

यदि आपकी पृष्ठभूमि गोल कोनों आदि की है तो आप पोर्टरडफ.मोड.एसआरसी_एटीओपी का उपयोग कर सकते हैं।


1

वाक्य - विन्यास

"your image name".setColorFilter("your context".getResources().getColor("color name"));

उदाहरण

myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));

0

यह जो मैंने किया है:

public static Drawable changeDrawableColor(int drawableRes, int colorRes, Context context) {
    //Convert drawable res to bitmap
    final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableRes);
    final Bitmap resultBitmap = Bitmap.createBitmap(bitmap, 0, 0,
            bitmap.getWidth() - 1, bitmap.getHeight() - 1);
    final Paint p = new Paint();
    final Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, p);

    //Create new drawable based on bitmap
    final Drawable drawable = new BitmapDrawable(context.getResources(), resultBitmap);
    drawable.setColorFilter(new
            PorterDuffColorFilter(context.getResources().getColor(colorRes), PorterDuff.Mode.MULTIPLY));
    return drawable;
}

0

बस उपयोग करें

    android:drawableTint="@color/primary_color"

अपने XML फ़ाइल में। कस्टम रंग के लिए प्राथमिक_ रंग बदलें


0

इस प्रकार विधि बनाएँ:

//CHANGE ICON COLOR
private void changeIconColor(Context context ,int drawable){
    Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, drawable);
    assert unwrappedDrawable != null;
    Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
    DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.colorAccent));
}

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

    changeIconColor(this,R.drawable.ic_home);

0

सबसे आसान तरीका यह करने के लिए:

imageView.setColorFilter(Color.rgb(r, g b));

या

imageView.setColorFilter(Color.argb(a, r, g, b));

a, r, g, b: रंग argb मान।


यह तभी काम करेगा जब ओपी ड्रॉ की जगह इमेज व्यू का उपयोग कर रहा होगा।
सॉवरफाइबर

0

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

fun Drawable.tint(context: Context,  @ColorRes color: Int) {
    DrawableCompat.setTint(this, context.resources.getColor(color, context.theme))
}

और फिर बस करो

background.tint(context, R.color.colorPrimary)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.