Размер рисунка не работает

У меня очень простая форма, которую я хочу задать ширину:

<shape android:shape="rectangle">
    <solid android:color="@color/orange"/>
    <size android:width="2dp"/>
</shape>

Однако, когда я назначаю это на фоне EditText, он просто показывает оранжевый фон вместо прямоугольника шириной 2dp. Почему настройка размера не задана? Я хочу создать прозрачную рамку с оранжевым прямоугольником с левой стороны. У меня также есть это в селекторе:

<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>

Я попытался добавить высоту, чтобы увидеть, изменит ли размер. Это не так. Это похоже на его полное игнорирование размера. WTF?

Ответ 1

Просто для того, чтобы указать user983447 answer - атрибут size действительно означает пропорцию. Вы должны установить размер для всех форм в вашем послойного списке и он будет использован в пропорции при масштабировании - как layout_weight атрибут LinearLayout. Так что лучше назвать его не size а weight

Ниже приведено описание того, как реализовать верхнюю и нижнюю белые линии без использования атрибута size:

<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>

Ответ 2

Он может работать с foreground. Похоже, вы не можете установить фокусную гравитацию. Но вы можете на переднем плане. Я проверил API 21, 23 и 24 (ну, с предварительным просмотром Studio), а следующие места - сплошная точка круга в 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>

С помощью фрагмента макета

    <ImageView
            android:foreground="@drawable/list_new_dot"
            android:foregroundGravity="right|center_vertical"
            tools:src="@drawable/model_1_sm"
            />

ОБНОВЛЕНИЕ: пока он работает в средстве проектирования макетов, он не похож на эмулятор. ОБНОВЛЕНИЕ 2: поскольку у этого ответа есть несколько голосов, вы можете проверить, что я на самом деле использовал, чтобы показать новую индикаторную точку: https://gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb

Ответ 3

Я обнаружил, что список слоев был очень коварным в первый раз Androider из-за следующего. На первый взгляд большинство думало бы, что элементы верхнего, нижнего, правого, левого атрибутов относятся к верхнему, нижнему, правому, левому. Где значение следующего:

<item android:top="10dp">

Оттолкнет вас начальную точку 10dp от верхней части соответствующего контейнера. Это не тот случай. Подумайте об этом как ВЫКЛ сверху, снизу, справа, слева. <item android:top="10dp"> прежнему будет показывать вам начальную точку 10dp OFF сверху, но что происходит, когда вы хотите установить нижнюю границу?

<item android:bottom="20dp">

Это не даст вам дно на 20dp из TOP, а чуть ниже 20dp OFF BOTTOM контейнера.

Так, например, с контейнером 100dp, если вы хотите прямоугольник с верхним краем, начинающимся с 20dp и нижним краем на 40dp:

<item android:top="20" android:bottom="60dp">

Ответ 4

Для меня, задавая серьезность предмета, чтобы "центр" решил проблему. Например:

<item android:id="@android:id/progress" android:gravity="center">
    <clip>
        <shape>
            <size android:height="2dp"/>
            <solid android:color="@color/my_color"/>
        </shape>
    </clip>
</item>

Ответ 5

У меня была схожая проблема.

Документация (http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape) говорит:

<pазмер>

Размер формы. (...)

Примечание. Форма масштабируется до размера контейнера. Соотнесите размеры, определенные здесь, по умолчанию. Когда вы используете форму в ImageView, вы можете ограничить масштабирование, установив для android: scaleType значение "center".

Если я правильно понимаю, это означает, что тег "размер" не предназначен для установки размера, а для установки пропорций.

Ответ 6

Атрибут размера формы предоставит значение для drawable.getIntrinsicWidth & getIntrinsicHeight.

если рисованный контейнер (например, ImageView, TextView) имеет параметр макета WRAP_CONTENT, тогда размер контейнера изменится, если изменится масштабируемое чертежное состояние.

но есть ошибка в инфраструктуре android в реализации DrawState ImageView

ImageView только обновляет/изменяет размер его размерности по размеру на state_selected, но не на state_activated

Ответ 7

использовал это.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<stroke
    android:color="@color/lgray"
    android:width="1dip" />

<corners
    android:bottomLeftRadius="0dip"
    android:bottomRightRadius="0.1dip"
    android:topLeftRadius="0dip"
    android:topRightRadius="0.1dip" />

<solid android:color="@color/White" />

</shape>

поместите этот rectangle.xml в drawable.and установите фон вида.