Заповнення не впливає на <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.