Как установить допустимый размер в списке слоев

У меня проблема с настройкой размера отрисовки в списке слоев. Мой XML выглядит так:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
    <item android:drawable="@drawable/menu_drawable2"/>       
</layer-list>

Drawable1 больше Drawable2, поэтому Drawable2 изменяется. Как это переопределить и установить оригинальный размер Drawable2? Я не хочу, чтобы это изменило размеры. Я пытался с настройкой ширины и высоты, но это не работает. Кроме того, элементы рисования на самом деле не являются растровыми изображениями, это селекты, поэтому я не могу использовать хитрость растровых изображений.


Похоже, у меня есть половина решения с использованием "влево" и "вправо", но тем не менее, это не позволяет мне автоматически устанавливать точный размер изображения. Теперь мой XML выглядит так:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
    <item android:drawable="@drawable/menu_drawable2" android:right="150dp"/>       
</layer-list>

Ответ 1

Вы можете использовать параметры android: width и android: height с желаемыми значениями.

Ниже приведен пример нарисованного списка слоев и снимок экрана. Я использовал векторную графику из Google значков материалов и собственный селектор для рисования.

Исходная нарисованная форма circle.xml имеет размер 100dp x 100dp, но в drawable.xml я переопределяю эти значения на 24dp x 24dp с помощью параметров android: width и android: height.

Я надеюсь, что это поможет!

drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/circle" android:height="24dp" android:width="24dp"/>
    <item android:drawable="@drawable/ic_accessibility_black_24dp"/>
    <item android:drawable="@drawable/ic_http_white_24dp" android:gravity="center" android:top="-3dp" android:height="5dp" android:width="5dp"/>
</layer-list>

circle.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:innerRadius="20dp" android:shape="oval">
            <solid android:color="#CCC" />
            <size android:width="100dp" android:height="100dp"/>
        </shape>
    </item>
</selector>

screen shot

Ответ 2

Для этого вы можете использовать тег вставки. Например

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/menu_drawable1"/>
   <item>
       <inset android:drawable="@drawable/menu_drawable2"
           android:insetRight="50dp"
           android:insetTop="50dp"
           android:insetLeft="50dp"
           android:insetBottom="50dp" />
   </item>

Это создаст paddings вокруг вас menu_drawable2, чтобы он не масштабировался. Просто установите необходимые размеры.

Ответ 3

Похоже, у меня есть половина решения, используя "левый" и "правый", но все же это не позволяет мне автоматически устанавливать точный размер изображения. Теперь мой xml выглядит следующим образом:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
    <item android:drawable="@drawable/menu_drawable2" android:right="150dp"/>       
</layer-list>

Ответ 4

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

Ответ 5

Я также сталкивался с проблемой на Android 5.0 (API 21). Похоже, gravity из item не работает для API менее 23. Таким образом, макет требуется обновить, я сделал его совместимым, применив вычисленные отступы для второго узла элемента, который должен быть наложенным по правому верхнему углу наложения.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_svg_filter_black"/>

    <item
        android:left="16dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="16dp"
        android:drawable="@drawable/ic_circle_dot_red"
    />
</layer-list>

Ответ 6

Я не знаю его работ или нет, но вы пытались отделить их друг от друга?

что-то вроде этого:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
</layer-list>
<layer-list>
    <item android:drawable="@drawable/menu_drawable2"/>       
</layer-list>

или поместите что-то еще между ними как пустой макет с высотой и шириной 0dp.