Il riempimento non influisce su <shape> in un layout XML


92

Sto cercando di impostare il riempimento in un <shape>dichiarato all'interno di un file / layout XML. Ma qualunque cosa imposti, non cambia nulla in relazione al riempimento. Se modifico altre proprietà, vedo gli effetti sull'interfaccia utente. Ma non funziona con l'imbottitura. Potreste consigliarmi sui possibili motivi per cui ciò potrebbe accadere?

Ecco la forma XML che sto cercando di modellare:

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

Risposte:


113

Ho finalmente risolto il mio problema con l'imbottitura.

Quindi l'imbottitura qui non avrà alcun effetto sulla forma. Invece di questo, dovrai applicare il riempimento in un altro disegnabile che lo utilizzerà. Quindi, ho un disegnabile che usa la forma e lì faccio quanto segue:

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

Quindi, come puoi vedere nel secondo <item>elemento, ho impostato il padding (in alto e a destra). E dopo tutto funziona.

Grazie.


Ciao, non capisco come applicare questa soluzione al problema. Ho un pulsante che utilizza la forma e l'impostazione di adnroid: top e android: right non ha alcun effetto. Come risolverei questo problema? Grazie.
gelato

2
PENSO che quello che sta dicendo Lyubomyr sia di fare qualcosa del genere, che funziona per me, ma poi gli angoli hanno sempre uno sfondo bianco opaco, causando problemi di visualizzazione (scusate il formato nei commenti!): <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

Anche off-topic ma potrebbe essere utile: se il tuo drawable usato è solo un colore, puoi scrivere come android: drawable = "@ color / divider" pure. MA questo si rompe sui dispositivi più vecchi. L'ho provato su 2.2 ed era rotto. Non sono sicuro a quale livello sia diventato accettabile.
Pijusn

In realtà, <item>accetta i drawable figlio (sebbene non sia esplicitamente documentato). È così che puoi ottenere questo comportamento all'interno di un singolo xml.
Alex Cohn

3
Questa risposta sembra essere corretta anche sette anni dopo. Ciò che sulla terra è <shape><padding> per ?
David Lord

75

Come hanno accennato un paio di commenti, l'approccio migliore è avvolgere il <shape>in un <item>elemento e impostare invece il riempimento lì. Ci sono tuttavia altre opzioni disponibili che sono dettagliate nel link sottostante. per esempio

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

A seconda delle tue esigenze, invece di utilizzare un elenco di livelli, puoi utilizzare uno dei seguenti tipi di disegno:

  • lista dei livelli
  • selettore
  • elenco dei livelli
  • transizione

Per ulteriori informazioni sui tipi disegnabili disponibili, vedere questa documentazione di Android

Fonti:


sì, non hai menzionato<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924

@ user924 Non sono sicuro di quale sia il tuo punto. Si può includere l'elemento all'interno di un <layer-list> se questo serve ai propri scopi, ma non è necessario per la domanda originale né per trasmettere la soluzione generale che è di annidare il contenuto all'interno di un <item> con imbottitura
TheIT

3
Voglio dire, è meglio dare un esempio che puoi copiare ed eseguire senza edizioni, ma in questo caso <item> non sarebbe risolto (perché dovrebbe essere all'interno di <layer-list>)
user924

2
@ user924 Capisco cosa intendi ora, grazie mille per aver sottolineato il problema e aiutato a migliorare la risposta. Ho aggiornato il codice di esempio e aggiunto un commento sui tipi disegnabili disponibili
TheIT

22

Puoi provare gli inserti:

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

22

La risposta di Lyobomyr funziona, ma ecco la stessa soluzione applicata ma senza l'overhead di creare un nuovo disegnabile, riducendo così al minimo l'ingombro di file:

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

Copia / Incolla della risposta di anon sulla risposta SO sopra:

<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
Grazie per questa risposta Yahel, ma ricorda di non pubblicare solo link di risposte. Fornisci sempre tutte le informazioni necessarie nella tua risposta poiché il contenuto del link potrebbe cambiare o diventare non valido.
TheIT

Risposta modificata
Yahel

9

Ho risolto questo problema in questo modo:

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

ha appena aggiunto un tratto trasparente.


Intelligente, ma lo considererei un trucco: - /
dell116
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.