एंड्रॉइड आकार का रंग प्रोग्रामेटिक रूप से सेट करें


168

मैं प्रश्न को सरल बनाने के लिए संपादन कर रहा हूं, उम्मीद है कि एक सटीक उत्तर की ओर मदद करता है।

कहो मेरे पास निम्नलिखित ovalआकृति है:

<?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>

मैं एक गतिविधि वर्ग के भीतर से, प्रोग्रामेटिक रूप से रंग कैसे सेट करूं?


क्या आप यह करने के लिए लागू करने योग्य है?
विक्रम

ड्रॉबल एक है ovalऔर एक ImageView की पृष्ठभूमि है।
कोटे मौनो

यदि यह प्रश्न पूछा गया है तो बहुत मुश्किल है, क्या एक कैनवास पर कई चित्र बनाने और एक दृश्य की पृष्ठभूमि के रूप में स्तरित अंत उत्पाद सेट करने का कोई तरीका है?
कोतो मौन जू

आप इसे Viewकक्षा का विस्तार करके प्राप्त कर सकते हैं , और इसे baseएक लेआउट में दृश्य के रूप में उपयोग कर सकते हैं जो विजेट्स ( RelativeLayout, FrameLayout) को ओवरलैप करने की अनुमति देता है । इस विस्तारित Viewवर्ग के अंदर , आप कर सकते हैं draw multiple images onto a canvas। लेकिन, ऐसा करने से पहले, इस पर एक नज़र डालें -> लिंक (यदि आप पहले से नहीं है)।
विक्रम

जवाबों:


266

नोट : उत्तर उस परिदृश्य को कवर करने के लिए अद्यतन किया गया है जहां backgroundका उदाहरण है ColorDrawable। धन्यवाद टायलर Pfaff , यह इंगित करने के लिए।

ड्रॉबल एक अंडाकार है और एक इमेज व्यू की पृष्ठभूमि है

उपयोग करने Drawableसे प्राप्त करें :imageViewgetBackground()

Drawable background = imageView.getBackground();

सामान्य संदिग्धों के खिलाफ जाँच करें:

if (background instanceof ShapeDrawable) {
    // cast to 'ShapeDrawable'
    ShapeDrawable shapeDrawable = (ShapeDrawable) background;
    shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    // cast to 'GradientDrawable'
    GradientDrawable gradientDrawable = (GradientDrawable) background;
    gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    // alpha value may need to be set again after this call
    ColorDrawable colorDrawable = (ColorDrawable) background;
    colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

कॉम्पैक्ट संस्करण:

Drawable background = imageView.getBackground();
if (background instanceof ShapeDrawable) {
    ((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    ((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    ((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

ध्यान दें कि शून्य-जाँच की आवश्यकता नहीं है।

हालाँकि, यदि आपको mutate()कहीं और उपयोग किया जाता है, तो उन्हें संशोधित करने से पहले आपको ड्रॉबल्स पर उपयोग करना चाहिए । (डिफ़ॉल्ट रूप से, XML से लोड की गई ड्राअबल्स उसी स्थिति को साझा करती हैं।)


3
जवाब के लिए धन्यवाद। (+1)। मेरा कोड अन्य बगों का सामना कर रहा है इसलिए परीक्षण करना मुश्किल है। लेकिन फिर भी यह solidआकार के हिस्से को निर्धारित कर सकता है । strokeभाग के बारे में कैसे ?
कोटे मौनो जूल

1
@TiGer @usernameउपयोगकर्ता को एक सूचना भेजी जाती है यह सुनिश्चित करने के लिए आपको अपनी टिप्पणी में जोड़ना चाहिए । वैसे, आपको ShapeDrawableस्ट्रोक वाले हिस्से को सेट करने के लिए उप-वर्ग की आवश्यकता होगी । अधिक यहाँ जानकारी: लिंक । टिप्पणी को देखें क्योंकि यह स्वीकृत उत्तर के साथ एक समस्या का उल्लेख करता है।
विक्रम

3
android.graphics.drawable.GradientDrawable android.graphics.drawable.ShapeDrawable में ढाला नहीं जा सकता डाली मुझ पर विफल रहता है
जॉन

3
@ जॉन यदि आपकी ImageView'sपृष्ठभूमि एक पर सेट है GradientDrawable, getBackground()तो वापस नहीं आएगी ShapeDrawable। इसके बजाय, का उपयोग GradientDrawableकि लौटा दिया जाता है: GradientDrawable gradientDrawable = (GradientDrawable)imageView.getBackground();.... gradientDrawable.setColors(new int[] { color1, color2 });
विक्रम

2
धन्यवाद .. मेरी दुनिया को बचा लिया।
सिड_09

43

इसे अवश्य पसंद करें:

    ImageView imgIcon = findViewById(R.id.imgIcon);
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
    backgroundGradient.setColor(getResources().getColor(R.color.yellow));

1
@ user3111850 क्या आपने कॉल करने से पहले android:backgroundअपने xml या setBackgroundगतिविधि में भी जोड़ा था getBackground()? अगर आपने ऐसा किया है तो यह काम करना चाहिए।
ली यी हांग

41

एक सरल समाधान आजकल एक पृष्ठभूमि के रूप में आपके आकार का उपयोग करना होगा और फिर प्रोग्राम के माध्यम से अपना रंग बदलना होगा:

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

उपलब्ध विकल्पों के लिए PorterDuff.Mode देखें ।

अद्यतन (एपीआई 29):

उपरोक्त विधि को एपीआई 29 के बाद से हटा दिया गया है और इसे निम्नलिखित द्वारा प्रतिस्थापित किया गया है:

view.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)

उपलब्ध विकल्पों के लिए BlendMode देखें ।


4
सही एक है: view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP);चूंकि पृष्ठभूमि या गोल प्रांगण पर एक सीमा हो सकती है।
बर्काय तुरान्कि

1
एक अच्छा @ BerkayTurancı मेरे आकार में गोल कोनों था। मैं getBackground()कॉल को छोड़ सकता हूं । मेरे imageview.src में एक आकृति समाहित है और मैंने उपयोग किया है: imageIndicator.setColorFilter(toggleColor, PorterDuff.Mode.SRC_ATOP);जहाँ toggleColorसिर्फ एक int है जो पहले getColor () से परिणाम संग्रहीत करता है
कहीं 19

1
इसके PorterDuff.Modeलिए BlendModeColorFilterसंकलन की आवश्यकता नहीं है BlendMode। तो एपीआई 29 के लिए यह होना चाहिए view.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
ओनिक

अच्छा कैच @ ओनिक। मैंने उसी हिसाब से जवाब अपडेट किया है। धन्यवाद!
जॉर्जियोस

14

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

 public void setGradientColors(int bottomColor, int topColor) {
 GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]  
 {bottomColor, topColor});
 gradient.setShape(GradientDrawable.RECTANGLE);
 gradient.setCornerRadius(10.f);
 this.setBackgroundDrawable(gradient);
 }

और अधिक विस्तार के लिए इस लिंक की जाँच इस

आशा है कि मदद।


लिंक के लिए वोट करें लेकिन यह मेरे सवाल का जवाब नहीं है।
कोटे मौनो

13

उम्मीद है कि यह एक ही मुद्दे के साथ किसी को मदद मिलेगी

GradientDrawable gd = (GradientDrawable) YourImageView.getBackground();
//To shange the solid color
gd.setColor(yourColor)

//To change the stroke color
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics());
gd.setStroke(width_px, yourColor);

1
शुरू में मुझे यह काम नहीं मिला, मुझे लगा कि आपका कल्चर इस तरह प्रदान किया जाना चाहिए:gd.setStroke(width_px, Color.parseColor("#FF5722"));
pwnsauce

12

विक्रम के उत्तर पर विस्तार करते हुए , यदि आप गतिशील विचारों को रंग रहे हैं, जैसे कि पुनर्नवीनीकरण दृश्य आइटम, आदि .... तो आप संभवतः रंग सेट करने से पहले म्यूटेट () कॉल करना चाहते हैं। यदि आप ऐसा नहीं करते हैं, तो किसी भी दृश्य में एक सामान्य ड्रॉबल (यानी एक पृष्ठभूमि) भी है, जो कि उनके ड्रॉएबल परिवर्तित / रंगीन होगा।

public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) {

    if (background instanceof ShapeDrawable) {
        ((ShapeDrawable) background.mutate()).getPaint().setColor(color);
    } else if (background instanceof GradientDrawable) {
        ((GradientDrawable) background.mutate()).setColor(color);
    } else if (background instanceof ColorDrawable) {
        ((ColorDrawable) background.mutate()).setColor(color);
    }else{
        Log.w(TAG,"Not a valid background type");
    }

}

3
जरूरतों और अतिरिक्त जांच और पैरामीटर: उपयोग if (background instanceof LayerDrawable) { background = ((LayerDrawable) background.mutate()).getDrawable(indexIfLayerDrawable); } if (background instanceof ShapeDrawable)[...]करने वाले पृष्ठभूमि लेआउट से निपटने के लिए <layer-list ... <item ...
जॉनी

11

इस सवाल का जवाब कुछ समय पहले दिया गया था, लेकिन यह एक कोटलिन एक्सटेंशन फ़ंक्शन के रूप में फिर से लिखकर आधुनिकीकरण कर सकता है।

fun Drawable.overrideColor(@ColorInt colorInt: Int) {
    when (this) {
        is GradientDrawable -> setColor(colorInt)
        is ShapeDrawable -> paint.color = colorInt
        is ColorDrawable -> color = colorInt
    }
}

7

यह वह समाधान है जो मेरे लिए काम करता है ... इसे दूसरे प्रश्न में भी लिखा है: गतिशील रूप से आकार का रंग कैसे बदलें?

//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);

//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();

//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)

4

मेरे लिए कुछ भी काम नहीं करता है, लेकिन जब मैं टिंट रंग सेट करता हूं तो यह शेप ड्राएबल पर काम करता है

 Drawable background = imageView.getBackground();
 background.setTint(getRandomColor())

एंड्रॉयड 5.0 एपीआई 21 की आवश्यकता है


3

मेरे कोटलिन एक्सटेंशन फ़ंक्शन संस्करण संगत के साथ ऊपर दिए गए उत्तर पर आधारित है :

fun Drawable.overrideColor_Ext(context: Context, colorInt: Int) {
    val muted = this.mutate()
    when (muted) {
        is GradientDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        is ShapeDrawable -> muted.paint.setColor(ContextCompat.getColor(context, colorInt))
        is ColorDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        else -> Log.d("Tag", "Not a valid background type")
    }
}

1

त्रिज्या के साथ आकृति को भरने का सरल तरीका है:

(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);

1

हो सकता है कि मुझे बहुत देर हो जाए। लेकिन अगर आप कोटलिन का उपयोग कर रहे हैं। इस तरह से है

var gd = layoutMain.background as GradientDrawable

 //gd.setCornerRadius(10)
  gd.setColor(ContextCompat.getColor(ctx , R.color.lightblue))
  gd.setStroke(1, ContextCompat.getColor(ctx , R.color.colorPrimary)) // (Strokewidth,colorId)

का आनंद लें....


0

C # Xamarin का उपयोग करने वाले किसी के लिए, विक्रम के स्निपेट पर आधारित एक विधि है:

private void SetDrawableColor(Drawable drawable, Android.Graphics.Color color)
{
    switch (drawable)
    {
        case ShapeDrawable sd:
            sd.Paint.Color = color;
            break;
        case GradientDrawable gd:
            gd.SetColor(color);
            break;
        case ColorDrawable cd:
            cd.Color = color;
            break;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.