832

I have some problems finding the documentation of the definitions of shapes in XML for Android. I would like to define a simple circle filled with a solid color in an XML File to include it into my layout files.

Sadly the Documentation on android.com does not cover the XML attributes of the Shape classes. I think I should use an ArcShape to draw a circle but there is no explanation on how to set the size, the color, or the angle needed to make a circle out of an Arc.

3

19 Answers 19

1796

This is a simple circle as a drawable in Android.

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#666666"/> <size android:width="120dp" android:height="120dp"/> </shape> 
Sign up to request clarification or add additional context in comments.

11 Comments

And how to change the color dynamically?
@AnkitGarg you can apply a color filter from Java code (see Drawable class)
I tried dp and it was distorted into an oval shape. For me, using pt instead fixed it.
No need for the size in the shape if you later define a square size for the view.
Its shape is oval and not round. Can anyone confirm??
|
881

Set this as your view background

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <stroke android:width="1dp" android:color="#78d9ff"/> </shape> 

enter image description here

For solid circle use:

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

enter image description here

Solid with stroke:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#199fff"/> <stroke android:width="2dp" android:color="#444444"/> </shape> 

enter image description here

Note: To make the oval shape appear as a circle, in these examples, either your view that you are using this shape as its background should be a square or you have to set the height and width properties of the shape tag to an equal value.

5 Comments

Nice solution. Of course, the oval appears as a circle if the width and height of the view are the same. I think there was a way to make it appear as a circle no matter the size of the view.
@FerranMaylinch "I think there was a way to make it appear as a circle no matter the size of the view." I solved this using a RelativeLayout wrapping both an ImageView (with the circle as "src" drawable) with fixed width/height and a TextView that wraps a text (for instance).
I am doing the exact same thing but the circle is drawn as oval
What if we need it to create around a textview with different border colors at run time ?
@AnshulTyagi I believe you can do that by calling yourView.getBackground() and setting the color manually. you need to cast it to a proper type like ShapeDrawable. There are related questions on SO about this.
104

Code for Simple circle

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#9F2200"/> <stroke android:width="2dp" android:color="#fff" /> <size android:width="80dp" android:height="80dp"/> </shape> 

1 Comment

From stackoverflow.com/a/70477622/4440629, the file needs to go in res/drawable not res/layout
55

You can use VectorDrawable as below :

<?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="200dp" android:height="200dp" android:viewportHeight="64" android:viewportWidth="64"> <path android:fillColor="#ff00ff" android:pathData="M22,32 A10,10 0 1,1 42,32 A10,10 0 1,1 22,32 Z" /> </vector> 

The above xml renders as :

enter image description here

3 Comments

Hey, I am having a padding between circle and viewport. Can you help me out?
@Ajeet you can change the size of viewport and you can put your path inside group and specify the translation and scale <group android:translateX="-10" android:translateY="15"><path ...
@Riyas can you explain the pathData part? what those co-ordinates imply?
46

Look in the Android SDK samples. There are several examples in the ApiDemos project:

/ApiDemos/res/drawable/

  • black_box.xml
  • shape_5.xml
  • etc

It will look something like this for a circle with a gradient fill:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="270"/> </shape> 

Comments

25

If you want a circle like this

enter image description here

Try using the code below:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:innerRadius="0dp" android:shape="ring" android:thicknessRatio="2" android:useLevel="false" > <solid android:color="@android:color/white" /> <stroke android:width="1dp" android:color="@android:color/darker_gray" /> </shape> 

Comments

23
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <!-- fill color --> <solid android:color="@color/white" /> <!-- radius --> <stroke android:width="1dp" android:color="@color/white" /> <!-- corners --> <corners android:radius="2dp"/> </shape> 

1 Comment

What do the <corners /> do in an oval (which to my thinking don't have corners)?
22

Here's a simple circle_background.xml for pre-material:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="oval"> <solid android:color="@color/color_accent_dark" /> </shape> </item> <item> <shape android:shape="oval"> <solid android:color="@color/color_accent" /> </shape> </item> </selector> 

You can use with the attribute 'android:background="@drawable/circle_background" in your button's layout definition

1 Comment

+ add 'size' to the shape(s) (depending on usecase).
21

a circle shape in an Android XML drawable file

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="@android:color/white" /> <stroke android:width="1.5dp" android:color="@android:color/holo_red_light" /> <size android:width="120dp" android:height="120dp" /> </shape> 

Screenshot

enter image description here

Comments

18

res/drawble/circle_shape.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="oval"> <solid android:color="#e42828"/> <stroke android:color="#3b91d7" android:width="5dp"/> <!-- Set the same value for both width and height to get a circular shape --> <size android:width="250dp" android:height="250dp"/> </shape> </item> </selector> 

enter image description here

Comments

18

Try below code with dash:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="@dimen/_60sdp" android:height="@dimen/_60sdp" /> <solid android:color="@color/black" /> <stroke android:width="@dimen/_1sdp" android:color="@color/white" android:dashWidth="@dimen/_1sdp" android:dashGap="@dimen/_1sdp" /> 

Try code without dash:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="@dimen/_60sdp" android:height="@dimen/_60sdp" /> <solid android:color="@color/black" /> <stroke android:width="@dimen/_1sdp" android:color="@color/white" /> 
Without dash With dash
Output without dash Out put

Comments

10
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <stroke android:width="10dp" android:color="@color/white"/> <gradient android:startColor="@color/red" android:centerColor="@color/red" android:endColor="@color/red" android:angle="270"/> <size android:width="250dp" android:height="250dp"/> </shape> 

Comments

6

You can try this -

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="ring" android:innerRadiusRatio="700" android:thickness="100dp" android:useLevel="false"> <solid android:color="#CCC" /> </shape> 

Also, you can adjust the radius of the circle by adjusting android:thickness.

enter image description here

1 Comment

This is really nice! It certainly takes some playing with as the attributes are not intuitive. I managed to get this to display a nice empty circle for a border every time. And you can use padding to make sure the entire circle displays.
6

You can try to use this

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:innerRadius="0dp" android:shape="ring" android:thicknessRatio="2" android:useLevel="false" > <solid android:color="@color/button_blue_two" /> </shape> </item> 

and you don't have to bother the width and height aspect ratio if you are using this for a textview

Comments

6

First Create Drawable Resource file

enter image description here

Then Add this Code to the file

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" // here define the shape android:shape="oval"> <solid // here define your color android:color="#666666"/> <size // here define your shape size android:width="120dp" android:height="120dp"/> </shape> 

Comments

6

I couldn't draw a circle inside my ConstraintLayout for some reason, I just couldn't use any of the answers above.

What did work perfectly is a simple TextView with the text that comes out, when you press "Alt+Num7":

 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#0075bc" android:textSize="40dp" android:text="•"></TextView> 

Comments

3

You can create a custom drawable to change color and radius of the circle dynamically

import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; public class CircleDrawable extends Drawable { private Paint circlePaint; private int fillColor; private int strokeColor; private float radius; public CircleDrawable(int fillColor, int strokeColor, float radius) { this.fillColor = fillColor; this.strokeColor = strokeColor; this.radius = radius; circlePaint=new Paint(Paint.ANTI_ALIAS_FLAG); } @Override public void draw(@NonNull Canvas canvas) { int x=getBounds().centerX(); int y=getBounds().centerY(); //draw fill color circle circlePaint.setStyle(Paint.Style.FILL); circlePaint.setColor(fillColor); canvas.drawCircle(x,y,radius,circlePaint); // draw stroke circle circlePaint.setStyle(Paint.Style.STROKE); circlePaint.setColor(strokeColor); circlePaint.setStrokeWidth(5); canvas.drawCircle(x,y,radius,circlePaint); } @Override public void setAlpha(int alpha) { circlePaint.setAlpha(alpha); } @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { circlePaint.setColorFilter(colorFilter); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } } 

Set this from UI to get the circle shape

imageView.setImageDrawable(new CircleDrawable(Color.RED,Color.YELLOW,100)); 

The Output Will be like this

enter image description here

Comments

1
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="oval"> <solid android:color="@color/text_color_green"/> <!-- Set the same value for both width and height to get a circular shape --> <size android:width="250dp" android:height="250dp"/> </shape> </item> </selector> 

Comments

-21

Just use

ShapeDrawable circle = new ShapeDrawable( new OvalShape() ); 

3 Comments

And how can I set that as the src of an ImageView in my XML layout file?
This is not directly applicable for an xml layout code
this is actually works. Thanks :) val background = ShapeDrawable(OvalShape()) background.paint.color = ContextCompat.getColor(holder.getView().context, R.color.green) val layers = arrayOf(background, resource!!) greenRoundIcon.setImageDrawable(LayerDrawable(layers))

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.