2016-01-16 10 views
49

Sto tentando di utilizzare uno VectorDrawable in un LayerList senza ridimensionare il vettore. Ad esempio:Come centrare il vettore drawable in layer-list senza ridimensionare

<layer-list> 
    <item android:drawable="@color/grid_item_activated"/> 
    <item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/> 
</layer-list> 

Il drawable ic_check_white_48dp ID definito come:

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
     android:width="48dp" 
     android:height="48dp" 
     android:viewportWidth="24.0" 
     android:viewportHeight="24.0"> 
    <path 
     android:fillColor="#FFFFFFFF" 
     android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/> 
</vector> 

L'effetto desiderato è che l'icona di controllo per essere centrata nel drawable strato, senza scalare. Il problema è che l'elenco dei livelli sopra fa sì che l'icona di controllo sia ridimensionata per adattarsi alla dimensione del livello.

I può produrre l'effetto desiderato se si sostituisce la drawable vettore con PNGs per ogni densità e modificare lo strato lista come tale:

<layer-list> 
    <item android:drawable="@color/grid_item_activated"/> 
    <item> 
     <bitmap android:gravity="center" android:src="@drawable/ic_check_white_48dp"/> 
    </item> 
</layer-list> 

v'è alcun modo per farlo utilizzando un VectorDrawable ?

+7

Sembra che questo possa essere semplicemente un bug nell'API 21/22. Ho appena testato su un dispositivo API 23 e il vettore disegnabile era centrato correttamente. – ashughes

+0

Dovresti rispondere alla tua domanda e accettarla. In questo modo è più visibile e la domanda non appare come senza risposta. –

+1

Non ho risposto alla mia domanda perché non ho ancora una risposta su cosa fare su API 21/22. La mia soluzione temporanea era usare PNG anziché vettori. Sperando di trovare ancora un modo per far funzionare i vettori però. – ashughes

risposta

8

Mi sono imbattuto nello stesso problema cercando di centrare i vettori drawable su una lista a più livelli.

ho una soluzione, non è esattamente la stessa, ma funziona, è necessario impostare una dimensione per l'intero drawable e aggiungere imbottitura alla voce vettore:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape> 
      <size android:height="120dp" android:width="120dp"/> 
      <solid android:color="@color/grid_item_activated"/> 
     </shape> 
    </item> 
    <item android:top="24dp" 
      android:bottom="24dp" 
      android:left="24dp" 
      android:right="24dp" 
      android:drawable="@drawable/ic_check_white_48dp"/> 
</layer-list> 

Le dimensioni della forma di cui sopra imposta la dimensione dell'intero drawable, 120dp in questo esempio, il padding sul secondo item, 24dp in questo esempio, centra l'immagine vettoriale.

sua non equivale a usare il gravity="center" ma il suo modo di lavorare utilizzando vettori in API 21 e 22.

+1

Sembra che ciò richiederebbe di conoscere l'esatta dimensione del drawable (per impostare le dimensioni della forma), piuttosto che lasciare che riempia l'intero spazio con il controllo drawable centrato al suo interno. – ashughes

+0

è possibile non conoscere la dimensione ma non puoi cambiare il padding con questo metodo, puoi sovrapporre i drawable l'uno sopra l'altro in immagini. Come ho detto sopra, non esiste una soluzione perfetta per un 'gravity =" center "' nelle API 21 e 22. –

9

stati alle prese con lo stesso problema. L'unico modo che ho trovato per risolvere questo problema ed evitare drawable di scalare fino è stato quello di impostare la dimensione drawable ed usando la gravità per allinearlo:

<layer-list> 
    <item android:drawable="@color/grid_item_activated"/> 
    <item 
     android:gravity="center" 
     android:width="48dp" 
     android:height="48dp" 
     android:drawable="@drawable/ic_check_white_48dp"/> 
</layer-list> 

Speranza che aiuta!

+13

Questo non aiuta l'API 21-22, perché l'attributo 'width' non è disponibile su quei livelli API. Sull'API 23, questi non sono necessari, poiché il bug è corretto e il drawable non è più allungato. – WonderCsabo

+0

non funziona più! –

Problemi correlati