Что не так с моим списком слоев?

Я хотел установить пользовательское рисование как android:src FloatingActionButton в этом макете:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:sscce="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        sscce:fabSize="normal"
        android:src="@drawable/fab_drawable" />

</LinearLayout>

Я ожидал что-то вроде:

введите здесь описание изображения

Но я получил:

введите здесь описание изображения

Вот настраиваемый список слоев, который содержит несколько рисунков формы:

res/drawable/fab_drawable.xml:

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

    <item>
        <shape android:shape="oval">
            <solid android:color="#1AFF00" /> <!-- green -->
            <size android:width="150dp"
                android:height="150dp"/>
        </shape>
    </item>



    <item>
        <shape android:shape="oval">
            <solid android:color="#FC00FF" /> <!-- pink -->
            <size android:width="100dp"
                android:height="100dp"/>
        </shape>
    </item>



    <item>
        <shape android:shape="oval">
            <solid android:color="#0040FF" /> <!-- blue -->
            <size android:width="40dp"
                android:height="40dp" />
        </shape>
    </item>



    <item>
        <shape android:shape="oval" >
            <stroke android:width="3dp"
                android:color="#FF0000"/> <!-- red -->

            <solid android:color="#FFBF00" /> <!-- yellow -->
            <size android:width="24dp"
                android:height="24dp" />
        </shape>
    </item>

</layer-list>

person Solace    schedule 08.04.2016    source источник
comment
@BobMalooga Извини, мой плохой! Просто отредактировал вопрос и разместил весь файл. Если вы считаете, что я должен опубликовать остальную часть кода (например, основное действие, хотя в нем нет ничего особенного), дайте мне знать.   -  person Solace    schedule 08.04.2016
comment
Нет, это не имеет значения.   -  person Phantômaxx    schedule 08.04.2016
comment
Судя по всему, ваш рисунок должен работать нормально. В качестве альтернативы вы можете использовать VectorDrawable.   -  person Phantômaxx    schedule 08.04.2016


Ответы (1)


Хотя синтаксически возможно использовать значения dp, это, по-видимому, вызывает проблемы с некоторыми категориями плотности, поэтому вместо этого лучше использовать px. В любом случае чертежи формы будут масштабироваться, чтобы соответствовать их содержанию View, значения, которые вы предоставляете, просто влияют на пропорции формы.

Для вашего списка слоев вы должны предоставить общую «рамку» для размера всех рисунков формы, поскольку каждый слой будет масштабироваться, чтобы соответствовать View независимо от других.

Это означает, что меньшим кругам нужна дополнительная информация о том, как далеко от края они должны быть нарисованы. Для круга с центром в его контейнере:

расстояние = (размер_контейнера - размер_круга) / 2

Если мы возьмем 150px в качестве базового размера для всех рисунков, то, например, розовому кругу (размер 100px) нужно 25px расстояние до краев его контейнера.

Вы можете предоставить эту информацию, установив атрибуты для каждого item:

<item android:top="25px" android:left="25px" android:bottom="25px"  android:right="25px">
<shape android:shape="oval">
    <solid android:color="#FC00FF" /> <!-- pink -->
    <size android:width="100px"
          android:height="100px"/>
</shape>
</item>

Обратите внимание, что важно иметь атрибуты не только для верхнего/левого, но и нижнего/правого. Если вы пропустите какие-либо атрибуты, то чертеж будет масштабироваться, чтобы касаться соответствующего края, поэтому форма круга может отображаться как овал или как круг со смещением от центра.

person Bö macht Blau    schedule 13.04.2016