Shape Drawable Size не работает

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

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

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


person chubbsondubs    schedule 03.05.2012    source источник
comment
Как это у вас не работает? Работает как часы. может проблема в настройках вашего лейаута? Посмотрите, есть ли в вашем макете wrap_content для высоты и ширины.   -  person Daler    schedule 09.01.2013
comment
Это довольно просто. ‹size [...]/› игнорируется и всегда создает форму, которая заполняет представление.   -  person afk5min    schedule 15.04.2013
comment
Не всегда, уж точно не с атрибутами drawableTop/Bottom/etc.   -  person    schedule 18.02.2014
comment
@Daler, то, о чем вы говорите, просто игнорирует размер и заполняет представление. Вы должны были протестировать его. Ничего общего с настройками макета нет.   -  person Farid    schedule 12.07.2019


Ответы (8)


Для меня установка гравитации элемента на «центр» решила проблему. Например:

<item android:id="@android:id/progress" android:gravity="center">
    <clip>
        <shape>
            <size android:height="2dp"/>
            <solid android:color="@color/my_color"/>
        </shape>
    </clip>
</item>
person Simple UX Apps    schedule 09.07.2018
comment
Самый полезный ответ. Большое спасибо! - person rocknow; 13.07.2018
comment
Коронуйте этого парня! - person ZShock; 07.06.2019

Он может работать с 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

person androidguy    schedule 14.11.2016

Просто чтобы указать ответ пользователя 983447 - атрибут размера действительно означает пропорцию. Вы должны установить размер для всех фигур в вашем списке слоев, и он будет использоваться как пропорция при масштабировании — как атрибут 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>
person AlexD    schedule 11.02.2013
comment
Это имеет плохую производительность из-за перерисовки графического процессора (две фигуры заполняют все пиксели, когда вам нужны только две строки пикселей) - person Gilian; 21.06.2016
comment
@Gilian поправьте меня, если я ошибаюсь, но этот xml компилируется в какой-то подкласс Drawable через aapt, поэтому после завершения компиляции это просто класс Java, и производительность будет такой же, как для любого 9-патча или растрового изображения из точка зрения графического процессора. Так что, если дизайн требует этого, нет другого выхода. - person Max Ch; 02.09.2016

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

<item android:top="10dp">

Вы получите отправную точку в 10 dp от вершины соответствующего контейнера. Это не вариант. Думайте об этом как о ВНЕ, СВЕРХУ, НИЖНЕМ, СПРАВА, СЛЕВА. <item android:top="10dp"> по-прежнему даст вам начальную точку на 10 dp ОТ ВЕРХА, но что произойдет, если вы захотите установить низ?

<item android:bottom="20dp">

Это не даст вам дно на 20dp от ВЕРХА, а дно на 20dp ОТ ДНА контейнера.

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

<item android:top="20" android:bottom="60dp">
person user3442825    schedule 20.03.2014
comment
Это я действительно понял, когда разместил вопрос. Было бы мало смысла делать все это сверху, слева относительным для всех значений (т.е. сверху, слева, снизу, справа), потому что вы никогда не сможете определить форму, которая расширяется, чтобы соответствовать ее родительскому контейнеру, не зная размера контейнера. В этом конкретном случае у меня была форма, которая должна была быть фиксированного размера, поэтому я хотел использовать ширину/высоту для установки размера, но документы не объясняют систему координат ширины/высоты, поэтому вам остается только догадываться. - person chubbsondubs; 20.03.2014
comment
Спасибо, чувак, это было отличное объяснение! дайте мне понять, где я был неправ, и исправьте, наконец, проблему после нескольких часов! но палец вверх для вас! +1 - person Alexiscanny; 23.05.2017

У меня была аналогичная проблема.

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

<размер>

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

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

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

person user983447    schedule 06.09.2012
comment
Итак, он говорит, что ширина/высота являются целыми числами, но то, что вы опубликовали, звучит так, как будто они могут быть процентами (0..1) или такими же большими, как размер контейнера (0..view.width)?! Или вы говорите, что это имеет смысл, и вы знаете, как это работает, и можете объяснить это лучше, чем документы? Я не совсем понимаю вашу точку зрения. В любом случае, это, вероятно, гарантирует ошибку, чтобы либо очистить чрезвычайно ужасную документацию, либо исправить код, чтобы на самом деле была ширина и высота. - person chubbsondubs; 06.09.2012

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

если контейнер drawable (например, ImageView, TextView) имеет параметр макета WRAP_CONTENT, тогда размер контейнера изменится, если изменится drawState drawable.

но есть ошибка в платформе Android в реализации DrawingState ImageView

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

person user882729    schedule 21.03.2015

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

<?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 установите свой фон просмотра.

person Harshid    schedule 11.02.2013

Размер фигуры будет игнорироваться, если вы используете ее в качестве фона для View. Он будет работать, если вы покажете его через ImageView:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#FF7700" />
    <size android:width="20dp" android:height="20dp"/>
</shape>

В вашем макете XML:

<!-- will have the size of 20dp x 20dp -->
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_shape"
    />
person Cristan    schedule 03.03.2021