Drawing multiple shapes with ShapeDrawable in xml with Android

AndroidXmlDrawableShapes

Android Problem Overview


I am currently drawing a number of circles on a canvas in a custom view in code. the circles are static and do not change. I would like to draw them using a ShapeDrawable in xml to help clean up my code. I will have a number of different drawables which the user can select and therefore I don't want to do this in code. having 3 or 4 xml drawables seems a lot neater to me.

I have created one circle in xml using a ShapeDrawable but am unable to add more than one shape to the xml.

How do I add multiple shapes to an xml document using ShapeDrawable.

Android Solutions


Solution 1 - Android

Here's how I did a filled red circle with a one-pixel black border, with a white number 72 in the middle:

Create an XML file in res\drawable and name it appropriately, eg red_circle_black_border.xml

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
	<item>
		<shape android:shape="oval">
			<solid android:color="@android:color/black" />
		</shape>
	</item>
	<item android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp">
		<shape android:shape="oval">
			<solid android:color="@android:color/red" />
		</shape>
	</item>
</layer-list>

Then, to use it in your layout, declare it as follows:

<TextView
	android:text="72"
	android:textSize="14dp"
	android:textStyle="bold"
	android:background="@drawable/red_circle_black_border" 
	android:layout_width="22dp"
	android:layout_height="22dp"
	android:gravity="center_vertical|center_horizontal"
	android:textColor="@android:color/white" />

Obviously, change the textSize and layout_width/height as required :-)

Solution 2 - Android

I think I have found a solution to add multiple shapes to my xml file using Layer-list. I havent tried this yet but this seems t be exactly what I want as the shapes will be draw in the order of their array index.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item>
      <shape>
         <solid android:color="#FFF8F8F8" />
      </shape>
   </item>
   <item android:top="23px">
      <shape>
         <solid android:color="#FFE7E7E8" />
      </shape>
   </item>
</layer-list>

Blog post

Android docs

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
QuestionskyfootView Question on Stackoverflow
Solution 1 - AndroidKenton PriceView Answer on Stackoverflow
Solution 2 - AndroidskyfootView Answer on Stackoverflow