Shape Drawable Size not working
Solution 1
For me, setting the gravity of the item to "center" solved the issue. For example:
<item android:id="@android:id/progress" android:gravity="center">
<clip>
<shape>
<size android:height="2dp"/>
<solid android:color="@color/my_color"/>
</shape>
</clip>
</item>
Solution 2
It can work with a foreground
. It seems like you can't set a background's gravity. But you can on a foreground. I checked API 21, 23 and 24 (well, with the Studio design preview) and the following places a solid circle dot on the ImageView.
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimary" />
<size android:height="8dp" android:width="8dp" />
</shape>
With the layout snippet
<ImageView
android:foreground="@drawable/list_new_dot"
android:foregroundGravity="right|center_vertical"
tools:src="@drawable/model_1_sm"
/>
UPDATE: While it appears to work in the layout design tool, it doesn't look the same in the emulator. UPDATE 2: Since this answer has a few votes, you might want to check what I actually used in order to show a new indicator dot: https://gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb
Solution 3
Just to specify the user983447's answer - the size attribute does really mean a proportion. You should set the size for all shapes in your layer-list and it'll be used a as a proportion when scaling - like the layout_weight
attribute of LinearLayout
. So it's better to name it not a size
but a weight
Below is a work-around how to implement top and bottom white lines without using the size
attribute:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#fff" />
</shape>
</item>
<item android:top="1dp" android:bottom="1dp">
<shape>
<solid android:color="#888" />
</shape>
</item>
</layer-list>
Solution 4
I found the layer-list to be very devious for a first time Androider because of the following. At first glance most would think item top,bottom,right,left attributes are FROM the top,bottom,right,left. Where a value of the following:
<item android:top="10dp">
Would net you a starting point 10dp from the top of the respective container. This is not the case. Think of it as OFF OF the top,bottom,right,left. <item android:top="10dp">
will still net you a starting point 10dp OFF OF the top, but what happens when you want to set the bottom?
<item android:bottom="20dp">
This will not get you a bottom at 20dp from the TOP, rather a bottom of 20dp OFF OF the BOTTOM of the container.
So, for example with a 100dp container, if you wanted a rectangle with a top edge starting at 20dp and a bottom edge at 40dp:
<item android:top="20" android:bottom="60dp">
Solution 5
shape's size attribute will provide the value for drawable.getIntrinsicWidth & getIntrinsicHeight.
if the drawable's container(e.g. ImageView, TextView) has the layout param WRAP_CONTENT, then the container dimension will change if the drawable drawingState change.
but there are a bug in android framework in ImageView drawingState implementation
ImageView only update/resize its dimension by the drawable dimension on state_selected but don't on state_activated
![chubbsondubs](https://i.stack.imgur.com/fEqVo.png?s=256&g=1)
chubbsondubs
Updated on March 04, 2021Comments
-
chubbsondubs over 3 years
I have a very simple shape that I want to set the width of:
<shape android:shape="rectangle"> <solid android:color="@color/orange"/> <size android:width="2dp"/> </shape>
However, when I assign this to the background of a EditText it just shows an orange background instead of a rectangle of width 2dp. Why isn't setting the size working? I want to create a transparent drawable with a orange rectangle on the left side. I also have this wrapped in a selector:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true"> <shape android:shape="rectangle"> <solid android:color="@color/orange"/> <size android:width="2dp" android:height="6dp"/> </shape> </item> <item> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent"/> </shape> </item> </selector>
I've tried adding height just to see if it would change the size. It doesn't. It's like its completely ignoring the size. WTF?