गतिशील रूप से आकार का रंग कैसे बदलें?


136

मेरे पास है

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <solid
       android:color="#FFFF00" />
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
</shape>

<TextView
    android:background="@drawable/test"
    android:layout_height="45dp"
    android:layout_width="100dp"
    android:text="Moderate"
/>

इसलिए अब मैं चाहता हूं कि यह आकार वेब सेवा कॉल से वापस मिली जानकारी के आधार पर रंग बदले। तो यह हो सकता है कि पीले या हरे या लाल या जो कुछ भी मैं वेब सीरियस कॉल से प्राप्त रंग के आधार पर हो सकता है।

मैं आकार का रंग कैसे बदल सकता हूं? इस जानकारी के आधार पर?


3
@Couitchy विधि द्वारा नियुक्त के रूप में View.getBackground()रिटर्न एक GradientDrawableऔर एक नहीं ShapeDrawableएप्लिकेशन के कारण जब संदर्भ मिलता है और रंग प्रोग्राम के रूप में स्थापित करने के लिए कोशिश कर रहा अवैध कलाकारों की वजह से, क्रम में दुर्घटना। [एंड्रॉइड शेप डॉक] ( developer.android.com/guide/topics/resources/… ) बताता है: कंप्लीट किए गए संसाधन DATATYPE: रिसोर्स पॉइंटर टू एGradientDrawable
लुइस क्विजादा

जवाबों:


300

आप इसे इस तरह से संशोधित कर सकते हैं

GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);

9
Btn.getBackground क्या है?
चोबो 2

16
मुझे java.lang.ClassCastException: android.graphics.drawable.GradientDrawable cannot be cast to android.graphics.drawable.ShapeDrawableइस सुझाव की कोशिश करते हुए मिल रहा है ।
prolink007

2
काम नहीं करता। आपको कास्ट एरर मिलेगा। एक तय या दूसरे उत्तर को स्वीकार करने की आवश्यकता है
ndgreen

6
यह ठीक काम करता है। पिछली टिप्पणियों को हटा दिया गया है क्योंकि उत्तर संपादित हो गया है!
W3hri

4
shoul उपयोग GradientDrawable bgShape = (GradientDrawable) btn.getBground ()। getCurrent ();
naveed148

60

मेरे लिए, यह दुर्घटनाग्रस्त हो गया क्योंकि getBackgroundएक के GradientDrawableबजाय वापस आ गया ShapeDrawable

तो मैंने इसे इस तरह से संशोधित किया:

((GradientDrawable)someView.getBackground()).setColor(someColor);

42

यह मेरे लिए एक प्रारंभिक xml संसाधन के साथ काम करता है:

example.setBackgroundResource(R.drawable.myshape);
GradientDrawable gd = (GradientDrawable) example.getBackground().getCurrent();
gd.setColor(Color.parseColor("#000000"));
gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30});
gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6);

उपरोक्त परिणाम: http://i.stack.imgur.com/hKUR7.png


यह सही जवाब है। ऊपर दिए गए दोनों उत्तर मेरे लिए कारगर नहीं थे। मुझे इसके दोनों अपवाद मिल रहे हैं।
सानल वर्गीज

10

आप अपने खुद के आकार जावा में बना सकते हैं। मैंने पेज कंट्रोलर जैसे आईफोन के लिए ऐसा किया और जावा में आकृतियों को चित्रित किया:

/**
 * Builds the active and inactive shapes / drawables for the page control
 */
private void makeShapes() {

    activeDrawable = new ShapeDrawable();
    inactiveDrawable = new ShapeDrawable();
    activeDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);
    inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);

    int i[] = new int[2];
    i[0] = android.R.attr.textColorSecondary;
    i[1] = android.R.attr.textColorSecondaryInverse;
    TypedArray a = this.getTheme().obtainStyledAttributes(i);

    Shape s1 = new OvalShape();
    s1.resize(mIndicatorSize, mIndicatorSize);
    Shape s2 = new OvalShape();
    s2.resize(mIndicatorSize, mIndicatorSize);

    ((ShapeDrawable) activeDrawable).getPaint().setColor(
            a.getColor(0, Color.DKGRAY));
    ((ShapeDrawable) inactiveDrawable).getPaint().setColor(
            a.getColor(1, Color.LTGRAY));

    ((ShapeDrawable) activeDrawable).setShape(s1);
    ((ShapeDrawable) inactiveDrawable).setShape(s2);
}

उम्मीद है की यह मदद करेगा। Greez Fabian


7

हो सकता है कि किसी और को XML में रंग बदलने की आवश्यकता हो, जैसे कि मुझे कई ड्रॉबल्स बनाने की आवश्यकता नहीं है। फिर रंग के बिना एक सर्कल को आकर्षित करने योग्य बनाएं और फिर ImageView के लिए पृष्ठभूमि को निर्दिष्ट करें।

circle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
</shape>

और आपके लेआउट में :

<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@drawable/circle"
    android:backgroundTint="@color/red"/>

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

इस पद्धति के बारे में एक बग है जो इसे एंड्रॉइड लॉलीपॉप 5.0 (एपीआई स्तर 21) पर काम करने से रोकता है। लेकिन नए संस्करणों में तय किए गए हैं।


5
    LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
    final GradientDrawable shape = (GradientDrawable)
            bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
    shape.setColor(Color.BLACK);

राउंड_बटन_शैप को आकार xml फ़ाइल में कहां परिभाषित करना चाहिए?
जयेश

5

Circle.xml (ड्रा करने योग्य)

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid
    android:color="#000"/>

<size
    android:width="10dp"
    android:height="10dp"/>
</shape>

ख़ाका

<ImageView
      android:id="@+id/circleColor"
      android:layout_width="15dp"
       android:layout_height="15dp"
      android:textSize="12dp"
       android:layout_gravity="center"
       android:layout_marginLeft="10dp"
      android:background="@drawable/circle"/>

गतिविधि में

   circleColor = (ImageView) view.findViewById(R.id.circleColor);
   int color = Color.parseColor("#00FFFF");
   ((GradientDrawable)circleColor.getBackground()).setColor(color);

एक आदर्श नहीं है, लेकिन मुझे समाधान पाने में मदद की।
राकेश यादव

2

इस समाधान ने android sdk v19 का उपयोग करके मेरे लिए काम किया:

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

2

यदि आपके पास इस तरह से एक imageView है:

   <ImageView
    android:id="@+id/color_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="10dp"
    android:src="@drawable/circle_color"/>

जो इसे src के रूप में एक आकर्षक आकार देता है, आप आकृति का रंग बदलने के लिए इस कोड का उपयोग कर सकते हैं:

ImageView iv = (ImageView)findViewById(R.id.color_button);
GradientDrawable bgShape = (GradientDrawable)iv.getDrawable();
bgShape.setColor(Color.BLACK);

1

मेरा आकार xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid  android:color="@android:color/transparent" />
<stroke android:width="0.5dp" android:color="@android:color/holo_green_dark"/>
</shape>

मेरी गतिविधि xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="cn.easydone.test.MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
    <TextView
        android:id="@+id/test_text"
        android:background="@drawable/bg_stroke_dynamic_color"
        android:padding="20dp"
        android:text="asdasdasdasd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

मेरी गतिविधि जावा:

 TextView testText = (TextView) findViewById(R.id.test_text);
 ((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK);

परिणाम तस्वीर: परिणाम


1

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

एक्सएमएल:

<TextView
    android:id="@+id/textView"
    android:background="@drawable/test"
    android:layout_height="45dp"
    android:layout_width="100dp"
    android:text="Moderate"/>

जावा:

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

0

मैं रोनी के जवाब की कोशिश करता हूं, और मेरा ऐप क्रैश हो गया। फिर मैं अपने ड्रॉबल xml की जांच करता हूं। यह इस तरह दिख रहा है:

<selector >...</selector>

। मैंने इसे इसे बदल दिया है: (भी परिवर्तित विशेषताएँ)

<shape> ... </shape>

यह काम करता हैं।

उसी समस्या का सामना करने वालों के लिए।


0

drawable_rectangle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="@android:color/transparent" />

    <stroke
        android:width="1dp"
        android:color="#9f9f9f" />

    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp" />

</shape>

व्याख्यान दर्शन

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/drawable_rectangle"
    android:gravity="center"
    android:padding="10dp"
    android:text="Status"
    android:textColor="@android:color/white"
    android:textSize="20sp" />


public static void changeRectangleColor(View view, int color) {
    ((GradientDrawable) view.getBackground()).setStroke(1, color);
}    

changeRectangleColor(textView, ContextCompat.getColor(context, R.color.colorAccent));

0

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

@BindingAdapter("shapeColor")

// Method to load shape and set its color 

fun loadShape(textView: TextView, color: String) {
// first get the drawable that you created for the shape 
val mDrawable = ContextCompat.getDrawable(textView.context, 
R.drawable.language_image_bg)
val  shape =   mDrawable as (GradientDrawable)
// use parse color method to parse #34444 to the int 
shape.setColor(Color.parseColor(color))
 }

Res / drawable फ़ोल्डर में एक drawable आकार बनाएँ। मैंने एक वृत्त बनाया है

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<solid android:color="#anyColorCode"/>

<size
    android:width="@dimen/dp_16"
    android:height="@dimen/dp_16"/>
</shape>

अंत में इसे अपने दृश्य में देखें

  <TextView>
   .........
  app:shapeColor="@{modelName.colorString}"
 </Textview>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.