How to create android shape background programmatically?

AndroidAndroid Layout

Android Problem Overview


How to create this shape programmatically?

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

    <solid android:color="#e67e22"/> 
    <corners
        android:topLeftRadius="0dp"
        android:topRightRadius="0dp"
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"/>
</shape>

I've tried this simple function which gets corners, colors and sets that to shape:

    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.category_header);

    GradientDrawable drawable = (GradientDrawable) linearLayout.getDrawable();

    float[] values = { 0.2f, 0.2f, 0.2f, 0.2f };
    drawable.setCornerRadii(values);

But I got this error:

The method getDrawable() is undefined for the type LinearLayout

Android Solutions


Solution 1 - Android

You can do it like this:

public static void customView(View v, int backgroundColor, int borderColor)	{
	GradientDrawable shape = new GradientDrawable();
	shape.setShape(GradientDrawable.RECTANGLE);
	shape.setCornerRadii(new float[] { 8, 8, 8, 8, 0, 0, 0, 0 });
	shape.setColor(backgroundColor);
	shape.setStroke(3, borderColor);
	v.setBackground(shape);
}

See the documentation for the meaning of setCornerRadii params.

You can use this function throughout your app and can put border and background color of your choice.

Solution 2 - Android

If what you want is just a simple rounded rectangle, cut the long story short.

    float r=8; // the border radius in pixel
    ShapeDrawable shape = new ShapeDrawable (new RoundRectShape(new float[] { r, r, r, r, r, r, r, r },null,null));
    shape.getPaint().setColor(Color.RED);
    view.setBackground(shape);




  • What is the RoundRectShape ?

RoundRectShape specifies an outer (round) rect and an optional inner (round) rect.

// RoundRectShape constructor

   RoundRectShape(float[] outerRadii,
                     RectF inset,
                   float[] innerRadii);
  • outerRadii is an array of 8 radius values, for the outer roundrect. The first two floats are for the top-left corner (remaining pairs correspond clockwise). For no rounded corners on the outer rectangle, just pass null.

enter image description here

For example:

enter image description here

  • inset is a RectF that specifies the distance from the inner rect to each side of the outer rect. For no inner, pass null.

  • innerRadii is an array of 8 radius values, for the inner roundrect. The first two floats are for the top-left corner (remaining pairs correspond clockwise). For no rounded corners on the inner rectangle, pass null. If inset parameter is null, this parameter is ignored.

For example:

enter image description here

ShapeDrawable shape = new ShapeDrawable(
        new RoundRectShape(
            new float[]{20, 20, 20, 20, 20, 20, 20, 20},
            new RectF(10, 20, 10, 20),
            new float[]{40, 40, 40, 40, 40, 40, 40, 40}));

Solution 3 - Android

I've created a library which can help to create drawables programmatically.

See here: DrawableToolbox.

With DrawableToolbox, you can create it by:

Drawable drawable = new DrawableBuilder()
        .rectangle()
        .solidColor(0xffe67e22)
        .bottomLeftRadius(20) // in pixels
        .bottomRightRadius(20) // in pixels
//        .cornerRadii(0, 0, 20, 20) // the same as the two lines above
        .build();

Solution 4 - Android

You can also use OVAL shape instead of rectangle:

GradientDrawable shape = new GradientDrawable();
shape.setShape(GradientDrawable.OVAL);
shape.setColor(Color.WHITE);
shape.setStroke(2, Color.BLACK);
view.setBackground(shape);

Solution 5 - Android

If you want to Create

> Rounded drawable with Gradient

then use below code.

public static GradientDrawable generateGradientBackgroundCircular(String topColor, String bottomColor) {
    int[] colors = {Color.parseColor(topColor), Color.parseColor(bottomColor)};

    //create a new gradient color
    GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TL_BR, colors);
    gd.setShape(GradientDrawable.OVAL);

    return gd;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDolDurmaView Question on Stackoverflow
Solution 1 - Androidrahul shahView Answer on Stackoverflow
Solution 2 - AndroiducMediaView Answer on Stackoverflow
Solution 3 - AndroidHong DuanView Answer on Stackoverflow
Solution 4 - AndroidNicolasView Answer on Stackoverflow
Solution 5 - AndroidMihir TrivediView Answer on Stackoverflow