2009-10-25 12 views
48

Mam kształt z gradientem, którego używam jako elementu podziału między elementami ListView. I zostały zdefiniowane w następujący sposób:Jak dodać dopełnienie do gradientu <shape> w systemie Android?

<?xml version="1.0" encoding="UTF-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 

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

</shape> 

będzie dodam 6 pikseli wyściółkę po obu stronach gradientu, tak, że nie rozciąga się od krawędzi do krawędzi ekranu.

Jednak nie ważne, gdzie wstawię android:left="6px" i android:right="6px", wydaje się, że nie przynosi ono efektu. Mogę umieścić go w elemencie <shape>, w elemencie <gradient> lub osobnym <padding> dziecku <shape> i nic nie zmienia.

Jak mogę dodać dopełnienie po lewej i prawej stronie mojego dzielnika list?

+0

zaktualizowałem wszystkie odpowiedzi do korzystania DP nie PX ponieważ większość programistów czas powinien używaj dp, aby wziąć pod uwagę różne gęstości ekranu: http://developer.android.com/guide/practices/screens_support.html – Intrications

+2

Oprócz komentarzy i rozwiązań, które mówią, że nie należy używać px, użyj dp - Chciałbym dodać, że gradient nie ma atrybutu wysokości i jest w tym przypadku bezużyteczny. Wysokość powinna być stosowana jako atrybut elementu . – prodaea

+0

Możliwy duplikat [Wypełnienie nie wpływa na w układzie XML] (http://stackoverflow.com/questions/1283085/padding-doesnt-affect-shape-in-an-xml-layout) – tir38

Odpowiedz

20

Jednym z rozwiązań wydaje się być "zawinięcie" mojego losowania za pomocą innej opcji, która określa odpowiednie wypełnienie.

Na przykład list_divider.xml byłoby:

<?xml version="1.0" encoding="UTF-8"?> 
<layer-list 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item 
     android:left="6dp" 
     android:right="6dp" 
     android:drawable="@drawable/list_divider_inner" /> 

</layer-list> 

A potem list_divider_inner.xml byłby oryginalny odkształcalne:

<?xml version="1.0" encoding="UTF-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 

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

</shape> 

Te wyniki w dwóch plikach, aby określić prosty dzielnik chociaż. Nie wiem, czy jest jakiś sposób, żeby zrobić to tylko z jednym plikiem.

+1

px będzie wyglądać * świetny * nowoczesny telefon xhdpi. - Nie używaj px ** kiedykolwiek **. Użyj ** dp ** dla grafiki i ** sp ** dla rozmiarów czcionek. Przeczytaj: http://developer.android.com/guide/practices/screens_support.html – Martin

+1

@Martin Zaktualizowałem odpowiedź, aby użyć dp, aby uniknąć kopiowania i wklejania złych praktyk. – Intrications

+6

To pytanie dotyczyło użycia dokładnego podziału między elementami widoku listy. W tej konkretnej sytuacji szczególnie chciałem użyć dzielnika z pojedynczym pikselem, bez względu na rozdzielczość urządzenia, więc piksele były poprawne. – emmby

131

Myślę, że można połączyć je tak:

<?xml version="1.0" encoding="UTF-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    <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> 
</layer-list> 
+1

To rozwiązanie jest lepsze, ponieważ używa tylko jednego pliku. –

+1

Działa cudownie z najmniejszą zmianą: android: right = "6px" /> powinien być android: right = "6px"> – OrhanC1

+9

Oczywiście nie należy używać px - zawsze używaj ** dp ** lub ** sp **. – Martin

45

Innym rozwiązaniem korzystając wstawka:

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

    <shape 
     android:shape="rectangle"> 

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

    </shape> 

</inset> 
+0

@ instrukcje: nie trzeba edytować, używam px zamiast dp tutaj, ponieważ pytający chce tego. – Wayne

+1

W ten sposób możesz mieć to również w pliku selektora. – elimirks

Powiązane problemy