प्रोग्रामेटिक रूप से कोनों को गोल कैसे करें और यादृच्छिक पृष्ठभूमि रंग सेट करें


114

मैं एक दृश्य के कोनों को गोल करना चाहूंगा और रनटाइम पर सामग्री के आधार पर दृश्य का रंग भी बदलूंगा।

TextView v = new TextView(context);
v.setText(tagsList.get(i));
if(i%2 == 0){
    v.setBackgroundColor(Color.RED);
}else{
    v.setBackgroundColor(Color.BLUE);
}

v.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
v.setPadding(twoDP, twoDP, twoDP, twoDP);               
v.setBackgroundResource(R.drawable.tags_rounded_corners);

मैं उम्मीद कर रहा था कि एक ड्रॉबल सेट करना और रंग ओवरलैप करना होगा, लेकिन वे नहीं करते। जो भी मैं दूसरे को निष्पादित करता हूं वह परिणामी पृष्ठभूमि है।

क्या इस दृश्य को प्रोग्रामेटिक रूप से बनाने का कोई तरीका है, यह ध्यान में रखते हुए कि पृष्ठभूमि का रंग रनटाइम तक तय नहीं किया जाएगा?

संपादित करें: मैं परीक्षण के लिए अब केवल लाल और नीले रंग के बीच स्वैप कर रहा हूं। बाद में उपयोगकर्ता द्वारा रंग चुना जाएगा।

संपादित करें:

tags_rounded_corners.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners 
         android:bottomRightRadius="2dp" 
         android:bottomLeftRadius="2dp" 
         android:topLeftRadius="2dp" 
         android:topRightRadius="2dp"/>
</shape>

बेशक बैकग्राउंड कलर और बैकग्राउंड इमेज एक दूसरे को ओवरराइड करते हैं। आप क्या हासिल करने का प्रयास कर रहे हैं? क्या है tags_rounded_corners?
एलेक्स एमडीसी

क्या आप और कोड दिखा सकते हैं? यह ठीक लग रहा है, इसलिए मुझे आश्चर्य है कि आप इस तरह के सूची दृश्य का उपयोग कर सकते हैं, या मौजूदा टेक्स्टव्यू का पुन: उपयोग कर सकते हैं।
चांसुस्क

जवाबों:


211

इसके बजाय setBackgroundColor, पृष्ठभूमि को आकर्षित करने योग्य है और उसका रंग सेट करें:

v.setBackgroundResource(R.drawable.tags_rounded_corners);

GradientDrawable drawable = (GradientDrawable) v.getBackground();
if (i % 2 == 0) {
  drawable.setColor(Color.RED);
} else {
  drawable.setColor(Color.BLUE);
}

इसके अलावा, आप अपने भीतर पैडिंग को परिभाषित कर सकते हैं tags_rounded_corners.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <corners android:radius="4dp" />
  <padding
    android:top="2dp"
    android:left="2dp"
    android:bottom="2dp"
    android:right="2dp" />
</shape> 

पेरेस answe! इसने स्ट्रॉक के साथ भी काम किया, लेकिन क्या हम इसका उपयोग कर सकते हैं जैसे colorDrawable = resource.getDrawable (R.drawable.x_sd_circle); colorDrawable.setColorFilter (color, PorterDuff.Mode.SRC_ATOP); अगर हमारे पास सीमा नहीं है। लेकिन सीमा के मामले में क्या आप मुझे पोर्टरडफ को बता सकते हैं। इसलिए कि स्ट्रोक का रंग नहीं बदलेगा
अखिल

XML के माध्यम से पृष्ठभूमि रंग कैसे जोड़ें?
लेनिन राज राजशेखरन

2
यदि "v" v.getBackground की तुलना में TextView है () "java.lang.ClassCastException: jav.lang.ClassCastException: android.graphics.rectable.StateListDrawable डालेगा, android.gateics.drawable.GradientDrawable में नहीं डाला जा सकता है" क्या यह वास्तव में '13 में वापस काम कर रहा था?
सोनवोलोब

@sonavolob तुम सही हो। यह ClassCastException देता है
अदनान

सही समाधान! धन्यवाद!
बॉट

124

गोल कोनों को सेट करने और व्यू में यादृच्छिक पृष्ठभूमि रंग जोड़ने के लिए कुल प्रोग्रामेटिक दृष्टिकोण। मैंने कोड का परीक्षण नहीं किया है, लेकिन आपको विचार मिलता है।

 GradientDrawable shape =  new GradientDrawable();
 shape.setCornerRadius( 8 );

 // add some color
 // You can add your random color generator here
 // and set color
 if (i % 2 == 0) {
  shape.setColor(Color.RED);
 } else {
  shape.setColor(Color.BLUE);
 }

 // now find your view and add background to it
 View view = (LinearLayout) findViewById( R.id.my_view );
 view.setBackground(shape);

यहाँ हम ढाल का उपयोग कर रहे हैं ताकि हम इसका उपयोग कर सकें GradientDrawable#setCornerRadiusक्योंकि ShapeDrawableऐसा कोई तरीका उपलब्ध नहीं है।


13
shape.setCornerRadii (कोनों); इसका बहुत उपयोगी
उमेश

14
के PaintDrawableबजाय का उपयोग करने पर विचार करें GradientDrawable। यह गोल कोनों और सिर्फ एक रंग का समर्थन करता है जो एक ढाल से अधिक उपयुक्त लगता है।
Cimlman

2
यह अच्छी तरह से काम करता है! मैं इसे Xamarin में उपयोग करता हूं। var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
पियरे

अच्छा त्वरित समाधान, लेकिन ध्यान दें कि इसके लिए एपीआई न्यूनतम स्तर 16
अज्ञात देव

बस एक तरफ कोने के त्रिज्या को कैसे सेट करें?
बेनामी-ई

10

मुझे लगता है कि ऐसा करने का सबसे तेज़ तरीका है:

GradientDrawable gradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM, //set a gradient direction 
            new int[] {0xFF757775,0xFF151515}); //set the color of gradient
gradientDrawable.setCornerRadius(10f); //set corner radius

//Apply background to your view
View view = (RelativeLayout) findViewById( R.id.my_view );
if(Build.VERSION.SDK_INT>=16)
     view.setBackground(gradientDrawable);
else view.setBackgroundDrawable(gradientDrawable);    


5

अगर आपको स्ट्रोक नहीं हो रहा है तो आप इसका इस्तेमाल कर सकते हैं

colorDrawable = resources.getDrawable(R.drawable.x_sd_circle); 

colorDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);

लेकिन यह भी स्ट्रोक रंग बदल जाएगा


39
मैं इसका उपयोग करने जा रहा था, लेकिन मुझे एक आघात हो रहा है।
टिम मलसीद

2

यहां एक एक्सटेंशन का उपयोग करके एक उदाहरण दिया गया है। यह मानता है कि दृश्य की चौड़ाई और ऊंचाई समान है।

दृश्य आकार प्राप्त करने के लिए एक लेआउट परिवर्तन श्रोता का उपयोग करने की आवश्यकता है। तब आप इसे इस तरह से देख सकते हैंmyView.setRoundedBackground(Color.WHITE)

fun View.setRoundedBackground(@ColorInt color: Int) {
    addOnLayoutChangeListener(object: View.OnLayoutChangeListener {
        override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {

            val shape = GradientDrawable()
            shape.cornerRadius = measuredHeight / 2f
            shape.setColor(color)

            background = shape

            removeOnLayoutChangeListener(this)
        }
    })
}

1

आप किसी भी आइटम (लेआउट, टेक्स्टव्यू) के रंग को गतिशील रूप से बदल सकते हैं। कोड को लेआउट में रंगीन प्रोग्राम सेट करने के लिए नीचे देखें

गतिविधि में। जावा फ़ाइल


String quote_bg_color = "#FFC107"
quoteContainer= (LinearLayout)view.findViewById(R.id.id_quotecontainer);
quoteContainer.setBackgroundResource(R.drawable.layout_round);
GradientDrawable drawable = (GradientDrawable) quoteContainer.getBackground();
drawable.setColor(Color.parseColor(quote_bg_color));

drawable फ़ोल्डर में layout_round.xml बनाएं

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorPrimaryLight"/>
    <stroke android:width="0dp" android:color="#B1BCBE" />
    <corners android:radius="10dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

गतिविधियों में लेआउट। xml फ़ाइल

<LinearLayout
        android:id="@+id/id_quotecontainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

----other components---

</LinearLayout>


1

अधिक दृश्यता के लिए शीर्ष-स्तरीय उत्तर में @ cimlman की टिप्पणी की प्रतिलिपि बनाना :

PaintDrawable(Color.CYAN).apply {
  setCornerRadius(24f)
}

FYI करें: ShapeDrawable(और इसके उपप्रकार PaintDrawable) , डिफ़ॉल्ट आंतरिक चौड़ाई और ऊंचाई का उपयोग करता है 0. यदि ड्रॉबल आपके usecase में दिखाई नहीं देता है, तो आपको मैन्युअल रूप से आयाम सेट करने पड़ सकते हैं:

PaintDrawable(Color.CYAN).apply {
  intrinsicWidth = -1
  intrinsicHeight = -1
  setCornerRadius(24f)
}

-1एक जादू स्थिरांक है जो इंगित करता है कि एक ड्रॉबल की कोई आंतरिक चौड़ाई और ऊंचाई नहीं है ( स्रोत )।

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