Shape Drawable Size not working

76,069

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

Share:
76,069
chubbsondubs
Author by

chubbsondubs

Updated on March 04, 2021

Comments

  • chubbsondubs
    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?