Wypełnienie nie wpływa na <shape> w układzie XML

92

Próbuję ustawić dopełnienie w <shape>zadeklarowanym w pliku / układzie XML. Ale cokolwiek ustawię, nic się nie zmienia w odniesieniu do wypełnienia. Jeśli zmodyfikuję jakiekolwiek inne właściwości, zobaczę efekty w interfejsie użytkownika. Ale to nie działa z wyściółką. Czy mógłbyś doradzić, jakie są możliwe przyczyny takiego stanu rzeczy?

Oto kształt XML, który próbuję stylizować:

 <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>
Lyubomyr Dutko
źródło

Odpowiedzi:

113

W końcu rozwiązałem problem z wypełnieniem.

Tak więc wypełnienie tutaj nie będzie miało wpływu na kształt. Zamiast tego będziesz musiał zastosować wyściółkę w innym rysunku, który będzie go używał. Mam więc element do rysowania, który używa kształtu i wykonuję następujące czynności:

<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>

Czyli jak widać w drugim <item>elemencie ustawiłem dopełnienie (góra i prawo). A potem wszystko działa.

Dzięki.

Lyubomyr Dutko
źródło
Cześć, nie rozumiem, jak zastosować to rozwiązanie do problemu. Mam przycisk, który używa kształtu i ustawienia adnroid: top i android: right nie ma żadnego efektu. Jak bym to rozwiązał? Dzięki.
lody
2
Myślę, że Lyubomyr mówi, że powinien zrobić coś takiego, co dla mnie działa, ale wtedy rogi zawsze mają nieprzezroczyste białe tło, co powoduje problemy z wyświetlaniem (przepraszam za format w komentarzach!): <Layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item> <shape android: shape =" rectangle "> <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,
Również nie na temat, ale może być przydatny: jeśli używany do rysowania jest tylko kolor, możesz również napisać jak android: drawable = "@ color / divider". ALE to się psuje na starszych urządzeniach. Przetestowałem to na 2.2 i było zepsute. Nie jestem pewien, na jakim poziomie stało się to do zaakceptowania.
Pijusn
Właściwie <item>akceptuje rysunki podrzędne (chociaż nie jest to wyraźnie udokumentowane). W ten sposób możesz osiągnąć to zachowanie w pojedynczym pliku XML.
Alex Cohn
3
Ta odpowiedź wydaje się być poprawna nawet siedem lat później. Co na ziemi jest <shape><padding> za ?
David Lord
75

Jak kilka uwag nie wspomniał, najlepszym rozwiązaniem jest, aby zawinąć <shape>w <item>elemencie i ustawić dopełnienie tam zamiast. Istnieją jednak inne dostępne opcje, które są szczegółowo opisane w linku poniżej. na przykład

<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>

W zależności od potrzeb, zamiast używać listy warstw, możesz użyć dowolnego z następujących typów do rysowania:

  • lista-warstw
  • selektor
  • lista-poziomów
  • przejście

Aby uzyskać więcej informacji o dostępnych typach do rysowania, zobacz tę dokumentację systemu Android

Źródła:

TheIT
źródło
tak, nie wspomniałeś<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924
@ user924 Nie jestem pewien, o co ci chodzi. Można umieścić element wewnątrz <layer-list>, jeśli służy to naszym celom, ale nie jest to konieczne dla pierwotnego pytania ani do przekazania ogólnego rozwiązania, którym jest zagnieżdżenie treści wewnątrz <item> z dopełnieniem
TheIT
3
Chodzi mi o to, że lepiej podać przykład, który można skopiować i uruchomić bez edycji, ale w tym przypadku <item> nie zostałby rozwiązany (ponieważ powinien znajdować się w <layer-list>)
user924
2
@ user924 Rozumiem, co masz na myśli. Wielkie dzięki za wskazanie problemu i pomoc w poprawieniu odpowiedzi. Zaktualizowałem przykładowy kod i dodałem komentarz na temat dostępnych typów do
rysowania
22

Możesz wypróbować wstawki:

<?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>
Witoldio
źródło
22

Odpowiedź Lyobomyr działa, ale tutaj zastosowano to samo rozwiązanie, ale bez narzutu związanego z tworzeniem nowego elementu rysunkowego, co minimalizuje bałagan w pliku:

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

Skopiuj / wklej anwser przez anon na odpowiedź SO powyżej:

<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>

Yahel
źródło
1
Dzięki za tę odpowiedź Yahel, ale pamiętaj, aby nie publikować linków tylko odpowiedzi. W odpowiedzi zawsze podawaj wszystkie niezbędne informacje, ponieważ treść linku może ulec zmianie lub stać się nieważna.
IT
Edytowano odpowiedź
Yahel
9

Rozwiązałem ten problem w ten sposób:

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

właśnie dodałem do niego przezroczysty obrys.

rzeka
źródło
Sprytne, ale
uznałbym