Понимание ‹layer-list› в Android

Я не понимаю, как работают списки слоев. Я прочитал официальную документацию с некоторыми примерами, но это действительно так. не работает для меня, как ожидалось. Мне нужны четыре квадрата, которые должны быть заполнены 1dp, но все не так, как ожидалось. Вот скриншот в масштабе 500%:

My suares
(Неправильные цвета не имеют значения)
Как вы можете видеть, что размер совершенно неправильный, а прокладки отсутствуют. Я попытался установить реальные значения, такие как ширина / высота и вправо / влево / вверху / внизу, чтобы убедиться, что Android понял то, что я хочу.

Вот мой 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>

person rekire    schedule 21.01.2013    source источник
comment
Как делал скриншот? потому что изображение, которое он дает мне, выглядит абсолютно правильным ...   -  person OcuS    schedule 21.01.2013
comment
Я взял визуальный редактор из затмения.   -  person rekire    schedule 21.01.2013
comment
@rekire Редактор глючит, просто чтобы вы знали, он не всегда отображает правильную форму. Всегда проверяйте устройство.   -  person basickarl    schedule 13.03.2015


Ответы (2)


Значения для левого, верхнего, правого и нижнего края измеряются от их соответствующих краев.

Таким образом, left = 0dp, top = 0dp, bottom = 0dp и right = 50dp даст вам прямоугольник шириной (match_parent - 50dp), а не 50dp. Поэтому большие значения для «правого» на самом деле дадут вам прямоугольник меньшего размера.

То же самое применимо и к другим значениям, но в большинстве случаев они будут вести себя так, как ожидалось, это просто «правильно», что может вызвать путаницу.

person Andrew Kelly    schedule 04.06.2013
comment
Это похоже на отступы в html, right = 50dp добавляет отступ 50dp вправо. - person The Demz; 06.10.2014

Либо вы используете px вместо dp, либо умножаете все измерения на 10.

Мне стыдно признать, что я точно не знаю, ПОЧЕМУ это происходит, но я предполагаю, что это как-то связано с плотностями, где 1dp - плавающее значение px, а ImageView - увеличено.

Ответ эксперта приветствуется :)

person OcuS    schedule 21.01.2013
comment
Вы правы, но я бы хотел быть независимым от dpi. Не могли бы вы предоставить дополнительную информацию, например, действительно ли мне нужны все значения прямоугольника (вверху, слева, справа, снизу) и идея, почему dp, похоже, не работает в eclipse. - person rekire; 21.01.2013
comment
Я снова нашел этот ответ, наконец, я использовал px и использовал для других размеров экрана (ldpi, mdpi, hdpi, xhdpi и xxhdpi) другие значения. - person rekire; 17.12.2013