Understanding Android's <layer-list>

AndroidXml DrawableAndroid DrawableLayer List

Android Problem Overview


I don't understand how the layer-lists work. I read the official documentation with some examples but it does not work for me like expected. I want four squares which should be padded with 1dp, but nothing is like expected. Here is a screenshot scaled by 500%:

My suares
(The wrong colors do not matter)
As you can see the size is completely wrong and the paddings are missing. I tried to set real values like width/height and right/left/top/buttom to be sure that android get the point what I want.

Here is my xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp">
		<shape android:shape="rectangle">
		    <size android:width="9dp"
		        android:height="9dp"/>
			<solid android:color="#f000"/>
		</shape>
	</item>
    
    <item android:top="1dp" android:left="1dp" android:bottom="5dp" android:right="5dp">
		<shape android:shape="rectangle">
		    <size android:width="3dp"
		        android:height="3dp"/>
			<solid android:color="#f00"/>
		</shape>
	</item>
	<item android:top="1dp" android:left="5dp" android:bottom="5dp" android:right="1dp">
		<shape android:shape="rectangle">
		    <size android:width="3dp"
		        android:height="3dp"/>
			<solid android:color="#0f0"/>
		</shape>
	</item>
		
	<item android:top="5dp" android:left="1dp" android:bottom="1dp" android:right="5dp">
		<shape android:shape="rectangle">
		    <size android:width="3dp"
		        android:height="3dp"/>
			<solid android:color="#0f0"/>
		</shape>
	</item>
	<item android:top="5dp" android:left="5dp" android:bottom="1dp" android:right="1dp">
		<shape android:shape="rectangle">
		    <size android:width="3dp"
		        android:height="3dp"/>
			<solid android:color="#f00"/>
		</shape>
	</item>
</layer-list>

Android Solutions


Solution 1 - Android

The values for left, top, right and bottom are measured from their respective edge.

So left=0dp, top=0dp, bottom=0dp & right=50dp will give you a rectangle that is (match_parent - 50dp) wide and not 50dp wide. Therefore larger values for "right" will actually give you a smaller rectangle.

The same would apply to the other value, but these would behave as expected in most cases, its just "right" that might cause confusion.

Solution 2 - Android

Either you use px instead of dp or multiply all dimensions by 10.

I'm ashamed to admit that I don't exactly know WHY this is happening but my guess is that it has something to do with densities where 1dp is a floating px value and the ImageView is scaled up.

Expert answer is welcomed :)

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
QuestionrekireView Question on Stackoverflow
Solution 1 - AndroidAndrew KellyView Answer on Stackoverflow
Solution 2 - AndroidOcuSView Answer on Stackoverflow