Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I need to change the stroke color to a user defined color. Nothing to do with the state

I need to change the stroke color from the app. The user is able to change the background color so I need to also let them change the stroke (outline) of the button. As its is already set in the drawable (sample below) I have not found a way to change this. Seems like all of the other questions like this just said to use the XML file.... but that doesnt let me make it dynamic. Thank you for any help!

I need to change the stroke color to a user defined color. Nothing to do with the state.

<?xml version="1.0" encoding="UTF-8"?>  <shape xmlns:android="http://schemas.android.com/apk/res/android">       <solid android:color="#ffffffff"/>           <stroke                 android:width="3dp"                 android:color="@color/Dim_Gray" />  <<<<--- This is what I need to change       <padding android:left="10dp"              android:top="10dp"              android:right="10dp"              android:bottom="10dp"              />       <corners android:bottomRightRadius="12dp" android:bottomLeftRadius="12dp"       android:topLeftRadius="12dp" android:topRightRadius="12dp"/>   </shape> 
like image 238
Mark Worsnop Avatar asked Jan 23 '11 05:01

Mark Worsnop


People also ask

How do I change the drawable stroke color programmatically?

To set the shape stroke color programmatically this example uses GradientDrawable method setStroke(int width, int color) which sets the stroke width and change shape's color. Here default orange color of the shape drawable is changes programetically usingb GradientDrawable method setStroke(int width, int color).

What is stroke color in Android?

strokeColor defines the color of the stroke. strokeWidth defines the width (in dp) of the stroke (2dp in this case, as suggested by the guidelines).


2 Answers

1. If you have drawable file for a "view" like this

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" >  <corners android:radius="5dp" />  <solid android:color="@android:color/white" />  <stroke     android:width="3px"     android:color="@color/blue" />  </shape> 

Then you can change
a. Stroke color :

GradientDrawable drawable = (GradientDrawable)view.getBackground(); drawable.setStroke(3, Color.RED); // set stroke width and stroke color  


b. Solid color :

GradientDrawable drawable = (GradientDrawable)view.getBackground(); drawable.setColor(Color.RED); // set solid color 

2. If you have drawable file for a "view" like this

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:state_checked="true" android:id="@+id/buttonSelected">         <shape>             <solid android:color="@color/blue" />             <stroke android:width="1px" android:color="@color/blue" />         </shape>     </item>     <item android:state_checked="false" android:id="@+id/buttonNotSelected">         <shape android:shape="rectangle">             <solid android:color="@color/white" />             <stroke android:width="1px" android:color="@color/blue" />         </shape>     </item> </selector> 

Then you can change the individual item attributes by taking separate drawable objects by there positions.

StateListDrawable drawable = (StateListDrawable)view.getBackground(); DrawableContainerState dcs = (DrawableContainerState)drawable.getConstantState(); Drawable[] drawableItems = dcs.getChildren(); GradientDrawable gradientDrawableChecked = (GradientDrawable)drawableItems[0]; // item 1  GradientDrawable gradientDrawableUnChecked = (GradientDrawable)drawableItems[1]; // item 2 

now to change stroke or solid color :

//solid color gradientDrawableChecked.setColor(Color.BLUE); gradientDrawableUnChecked.setColor(Color.RED);  //stroke gradientDrawableChecked.setStroke(1, Color.RED); gradientDrawableUnChecked.setStroke(1, Color.BLUE); 
like image 140
Rana Ranvijay Singh Avatar answered Sep 27 '22 18:09

Rana Ranvijay Singh


I needed a way to change the stroke color of any GradientDrawable without knowing the width of the stroke. My goal was to do this using Drawable.setTint. I had to add a transparent solid element to my shape xml to get it to work:

<!-- stroke_background.xml --> <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"     android:shape="rectangle">     <stroke         android:width="4dp"         android:color="@android:color/white" />     <!-- Need transparent solid to get tint applied to only the stroke -->     <solid android:color="@android:color/transparent"/> </shape> 
// StrokeView.kt setBackgroundResource(R.drawable.stroke_background) // Set the color of your stroke drawable.setTint(Color.BLUE)  

In your case, since you have both a solid and stroke, then you'll need to use a layer-list, where the stroke is added AFTER the solid (so that it's drawn on top). This will let you set different colors on the solid and the stroke without knowing in advance what the stroke width is:

<!-- stroke_solid_background.xml --> <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">     <item android:drawable="@drawable/solid_background" />     <item android:drawable="@drawable/stroke_background" /> </layer-list> 
// StrokeSolidView.kt setBackgroundResource(R.drawable.stroke_solid_background) (drawable as LayerDrawable).apply {     // Set the color of your solid     getDrawable(0).setTint(Color.GREEN)     // Set the color of your stroke     getDrawable(1).setTint(Color.BLUE) } 
like image 36
iamreptar Avatar answered Sep 27 '22 18:09

iamreptar