How to change color of drawable shapes in android
Solution 1
Change the layout color dynamically
LinearLayout Layout = (LinearLayout) findViewById(R.layout.id);
Layout.setBackgroundColor(Color.parseColor("#ffffff"));
Dynamically set the background color gradient
View layout = findViewById(R.id.mainlayout);
GradientDrawable gd = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[] {0xFF616261,0xFF131313});
gd.setCornerRadius(0f);
layout.setBackgroundDrawable(gd);
Solution 2
You could try something like this :
Drawable sampleDrawable = context.getResources().getDrawable(R.drawable.balloons);
sampleDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));
and for more you could refer to :
How to change colors of a Drawable in Android?
Change drawable color programmatically
Android: Change Shape Color in runtime
You could also try this :
private static final int[] FROM_COLOR = new int[]{49, 179, 110};
private static final int THRESHOLD = 3;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.test_colors);
ImageView iv = (ImageView) findViewById(R.id.img);
Drawable d = getResources().getDrawable(RES);
iv.setImageDrawable(adjust(d));
}
private Drawable adjust(Drawable d)
{
int to = Color.RED;
//Need to copy to ensure that the bitmap is mutable.
Bitmap src = ((BitmapDrawable) d).getBitmap();
Bitmap bitmap = src.copy(Bitmap.Config.ARGB_8888, true);
for(int x = 0;x < bitmap.getWidth();x++)
for(int y = 0;y < bitmap.getHeight();y++)
if(match(bitmap.getPixel(x, y)))
bitmap.setPixel(x, y, to);
return new BitmapDrawable(bitmap);
}
private boolean match(int pixel)
{
//There may be a better way to match, but I wanted to do a comparison ignoring
//transparency, so I couldn't just do a direct integer compare.
return Math.abs(Color.red(pixel) - FROM_COLOR[0]) < THRESHOLD && Math.abs(Color.green(pixel) - FROM_COLOR[1]) < THRESHOLD && Math.abs(Color.blue(pixel) - FROM_COLOR[2]) < THRESHOLD;
}
as given in How to change colors of a Drawable in Android?
Solution 3
The following works great for setting the color of the drawable programmatically without changing its shape:
parentLayout.getBackground().setColorFilter(
Color.BLACK,
PorterDuff.Mode.SRC_ATOP
);
Solution 4
use this..
<solid android:color="#e1e1e1" />
<stroke
android:width="2dp"
android:color="#808080" />
<corners android:radius="10dp" />
<padding
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp" />
Solution 5
One approach would be to create a second drawable XML with the 2nd color and then change the background of the layout with the 2nd drawable.
nilkash
Updated on July 16, 2020Comments
-
nilkash almost 4 years
I am developing small android application in which I set drawable resource as background for linear layout. Now what I want to do change background color of linear layout dynamically, but within drawable resource. My code looks like :
// bcd.xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <gradient android:endColor="#22000000" android:startColor="#22000000" android:angle="270" /> <stroke android:width="3dp" android:color="@color/white" /> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> </item>
<LinearLayout android:id="@+id/lin_llt" android:layout_width="wrap_content" android:layout_height="wrap_content" >
and I set background for linear layout in my activity like this...
parentLayout = (LinearLayout) view.findViewById(R.id.lin_llt); parentLayout.setBackgroundResource(R.drawable.bcd);
Now what I want to do i want to change color of my drawable resource that mean change color of my linear layout with rounded corner and padding define in drawable..
I tried this in following way
ShapeDrawable bgShape = (ShapeDrawable )parentLayout.getBackground(); bgShape.getPaint().setColor(Color.BLACK);
but its not working for me. any other solution .
So how to do it... Need help... thank you...
-
nilkash about 11 yearsHi lokoko thank you for reply. But when i tried your solution it gives me null pointer exception. What is wrong thing I am doing.Need help
-
nilkash about 11 yearshi androidguy thank you for reply. I wanted to change color of that drawable dynamically. so dont want to create different layout xml files. Is there any other solution
-
nilkash about 11 yearsHi priya thank you for reply. I can set background color in this way but after that i will not able to retain those rounded corners and padding which is define in drawable shape right? But I wanted to retain those as well.. is there any other solution...
-
AndroidGuy about 11 yearsHi nilkash. Not that I'm aware of, but I'm looking forward to hearing other solutions.
-
nilkash about 11 yearsHi lokoko thank you for reply.. I am jus asking that above solution is for image drawable or it it also work for drawable shapes.. Coz it converting that drawable into bitmap.
-
APriya about 11 yearsstackoverflow.com/questions/6115715/… -check this link
-
nilkash about 11 yearsHi priya thank you for giving me exact solution. It works for my. And its working fine. can you just update your answer with that answer so that others can also use it.
-
nilkash about 11 yearsthank you lokoko for your help. i tried your first solution. i did some changes in my code. now its working without any error. Tha only problem is that it not applying the changed color. that mean it runs properly but not changing color of that drawable..
-
nilkash about 11 yearsI tried in this way Drawable sampleDrawable = context1.getResources().getDrawable(R.drawable.bcd); sampleDrawable.setColorFilter(new PorterDuffColorFilter(0xff0000,PorterDuff.Mode.MULTIPLY)); parentLayout.setBackgroundDrawable(sampleDrawable);
-
Anup over 8 years@AndroidGuy yours was the solution i was hoping to find as with the approaches in previous answers wont work for me as i am reusing the drawable at multiple places and the
setbackgroundcolor()
on an xml drawable isstatic
-
Admin over 8 years@APriya Could you help with a similar problem in my question: stackoverflow.com/questions/35398658/…