Заповнення не впливає на <shape> у XML-макеті


93

Я намагаюся встановити відступи в <shape>оголошеному в XML-файлі / макеті. Але що б я не встановив, нічого не змінюється, пов’язане з заповненням. Якщо я зміню будь-які інші властивості, я бачу вплив на інтерфейс користувача. Але це не працює з прокладками. Не могли б ви повідомити про можливі причини, з яких це може статися?

Ось форма XML, яку я намагаюся створити:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" 
      android:shape="rectangle">

    <stroke android:width="1dp" 
            android:color="#ffffff" 
            android:dashWidth="2dp"/>

    <solid android:color="@color/button_white_cover"/>

    <corners android:radius="11dp"/>

    <padding android:left="1dp" 
             android:top="20dp"
             android:right="20dp" 
             android:bottom="2dp"/>
 </shape>

Відповіді:


113

Я нарешті вирішив свою проблему з прокладками.

Тож оббивка тут ніяк не вплине на форму. Замість цього вам доведеться застосувати заповнення в іншому малювальному файлі, який буде використовувати його. Отже, у мене є малюнок, який використовує форму, і я роблю наступне:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/shape_below"/>
   <item android:top="10px" android:right="10px" android:drawable="@drawable/shape_cover"/>
</layer-list>

Отже, як ви можете бачити у другому <item>елементі, я встановив відступ (зверху та праворуч). І після цього все працює.

Дякую.


Привіт, я не розумію, як застосувати це рішення до проблеми. У мене є кнопка, яка використовує форму та налаштування adnroid: top та android: right не впливає. Як би я це вирішив? Дякую.
— морозиво

2
Я ДУМАЮ, що Любомир каже, зробити щось подібне, що працює для мене, але тоді кути завжди мають непрозорий білий фон, що викликає проблеми з відображенням (вибачте за формат у коментарях!): <Layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item> <shape android: shape =" прямокутник "> <size android: width =" 0dp "android: height =" 45dp "android: color =" @ android: color / transparent "/> </shape> </item> <item android: top =" 0dp "android: right =" 0dp "android: bottom =" 0dp "android: left =" 0dp "android: drawable =" @ drawable / button_blue_shape "/> </layer-list>
— DustinB

Також не в темі, але може бути корисним: якщо використовуваний вами малюнок - лише колір, ви також можете писати як android: drawable = "@ color / spliter". АЛЕ це ламається на старих пристроях. Я протестував його на 2.2, і він був зламаний. Не впевнений, на якому рівні це стало прийнятним.
— Pijusn

Насправді <item>приймає дитячі витяжки (хоча це явно не задокументовано). Ось як ви можете досягти такої поведінки в межах одного xml.
— Алекс Кон,

3
Ця відповідь є вірною навіть через сім років. Що на землі <shape><padding> для ?
— Девід Лорд

75

Як пара коментарів послалися на, кращий підхід до обернути <shape>в <item>елемент і встановити відступи там замість цього. Однак є й інші варіанти, які детально описані в посиланні нижче. напр

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="8dp"
        android:right="8dp"
        android:top="8dp"
        android:bottom="8dp">

        <shape android:shape="rectangle">
            ...
        </shape>
    </item>
</layer-list>

Залежно від ваших потреб, замість того, щоб використовувати список шарів, ви можете використовувати будь-який із наступних типів малювання:

  • список шарів
  • селектор
  • рівень-список
  • перехід

Для отримання додаткової інформації про доступні типи малювання див. Цю документацію для Android

Джерела:


так, ви не згадали<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
— user924

@ user924 Я не впевнений, у чому ваша суть. Можна включити елемент всередину <списку шарів>, якщо це відповідає власним цілям, але це не потрібно ні для оригінального запитання, ні для передачі загального рішення, яке полягає у
— вкладенні

3
Я маю на увазі, що краще навести приклад, який ви можете копіювати та запускати без видань, але в цьому випадку <item> не буде вирішено (оскільки він повинен бути всередині <список-шару>)
— user924

2
@ user924 Я розумію, що ви маєте на увазі зараз, дякую, що вказали на проблему та допомогли покращити відповідь. Я оновив зразок коду та додав коментар щодо доступних типів, які можна
— малювати

23

Відповідь від Lyobomyr працює, але тут застосовується те саме рішення, але без накладних витрат на створення нового малюваного, що зводить до мінімуму безлад у файлах:

https://stackoverflow.com/a/3588976/578746

Скопіюйте / вставте anwser by anon у відповідь SO вище:

<item android:left="6dp"
      android:right="6dp">

    <shape android:shape="rectangle">
        <gradient android:startColor="#ccd0d3"
                  android:centerColor="#b6babd"
                  android:endColor="#ccd0d3"
                  android:height="1px"
                  android:angle="0"/>
    </shape>
</item>


1
Дякую за цю відповідь Яхель, але пам’ятайте, що не слід публікувати лише відповіді на посилання. Завжди вказуйте всю необхідну інформацію у своїй відповіді, оскільки вміст посилання може змінитися або стати недійсним.
— TheIT

Відповідь відредаговано
— Ягель,

22

Ви можете спробувати вставки:

<?xml version="1.0" encoding="UTF-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="2dp"
    android:insetLeft="1dp"
    android:insetRight="20dp"
    android:insetTop="20dp">

    <shape android:shape="rectangle">

        <stroke
            android:width="1dp"
            android:color="#ffffff"
            android:dashWidth="2dp" />

        <solid android:color="@color/button_white_cover" />

        <corners android:radius="11dp" />
    </shape>

</inset>

9

Я вирішив цю проблему так:

<shape android:shape="oval"  >
    <stroke android:width="4dp" android:color="@android:color/transparent" />
    <solid android:color="@color/colorAccent" />
</shape>

просто додав до нього прозорий штрих.


Розумно, але я вважав би це хакерством: - /
— dell116
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.