Shape drawable in layer-list отображается неправильно для API ниже 23

вчера я переключился на Android Studio версии 2.1.3. Сегодня я снова открыл один из своих проектов и попытался добавить некоторые drawables списка слоев для использования с ImageView. Например это:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:width="80px" android:height="80px"
        android:top="0px" android:left="0px" 
        android:right="0px" android:bottom="0px">
        <shape android:shape="rectangle">
            <solid android:color="@color/deep_orange"/>
        </shape>
    </item>
    <item android:width="60px" android:height="60px"
        android:top="10px" android:left="10px" 
        android:right="10px" android:bottom="10px">
        <shape android:shape="oval">
            <solid android:color="@color/light_yellow"/>
        </shape>
    </item>
</layer-list>

yellow circle above orange square

это то, что я использовал, чтобы получить перед обновлением моей версии Android Studio, и это то, что я получаю сейчас в предварительном просмотре, если я выберу 23 как "Android-версию для использования при рендеринге макетов в IDE".

, если я выберу любую версию ниже 23, я получу только квадрат:

orange square, no circle

к сожалению, я также не получаю ничего, кроме квадрата при запуске приложения на эмуляторе (Lollipop 22) или устройстве (Jellybean 18).

на всякий случай это полезно:

  • compileSdkVersion 23
  • buildToolsVersion "23.0.3"
  • minSdkVersion 11
  • targetSdkVersion 23
  • ничего buildType debug
  • зависимости: compile ' com.андроид.поддержка:совместимости приложений-В7:23.0.1'
  • the Activity выходит AppCompatActivity

Я думаю, что проблема как-то связанная с использованием top, left, right и bottom для верхнего слоя. Потому что, если я просто помещаю круг поверх квадрата, предварительный просмотр, а также "реальная вещь" работают так, как ожидалось для всех уровней API.

редактировать я также начал совершенно новый проект с тем же кодом / xml и следующий (автоматически созданный)build.gradle:

  • compileSdkVersion 24
  • buildToolsVersion "24.0.2"
  • minSdkVersion 15
  • targetSdkVersion 24
  • ничего для отладки buildType
  • зависимости: compile ' com.андроид.поддержка:совместимости приложений-В7:24.2.0'
  • the Activity выходит AppCompatActivity

то же самое поведение здесь: верхний слой не отображается для API leves top, left, right и bottom С ценностями != 0.


Итак, мой вопрос: как я могу создать фигурные чертежи "со вставками" для всех уровней API с помощью Android Studio 2.1.3?

1 ответов


прежде всего, я хотел бы поблагодарить @pskink за помощь в анализе проблемы:)

xml в вопросе работал для уровня API 23+, потому что

можно установить ширину и высоту прямо в теге "item"

как @Android разработчик государства это так пост

он не работал для более низких версий, потому что там нужно установить width и height атрибуты для ShapeDrawable С помощью size тег.

Я полагаю, что Android нужен размер, чтобы выяснить, как масштабировать drawable (- >соотношение сторон!) с учетом вставок (сверху, слева, справа, снизу).

и, как это иногда бывает с деформированным (для определенного уровня API) xml, Android не удалось молча и просто не рисовать форму.

таким образом, решение:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:width="80px" android:height="80px"
        android:top="0px" android:left="0px" 
        android:right="0px" android:bottom="0px">
        <shape android:shape="rectangle">
            <solid android:color="@color/deep_orange"/>
        </shape>
    </item>
    <item android:width="60px" android:height="60px"
        android:top="10px" android:left="10px" 
        android:right="10px" android:bottom="10px">
        <shape android:shape="oval">
            <solid android:color="@color/light_yellow"/>
            <size android:height="60px" android:width="60px"/>
        </shape>
    </item>
</layer-list>