2016-01-16 3 views
49

Ich versuche, eine VectorDrawable in einer LayerList ohne Skalierung des Vektors zu verwenden. Zum Beispiel:Wie man Vektor in der Ebenenliste ohne Skalierung zentriert

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

Die ziehbar ic_check_white_48dp id wie folgt definiert:

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

Der gewünschte Effekt ist für das Kontrollsymbol in der Ebene ziehbar zentriert werden, ohne Skalierung. Das Problem ist, dass die obige Ebenenliste dazu führt, dass das Prüfsymbol so skaliert wird, dass es der Ebenengröße entspricht.

I kann produzieren den gewünschten Effekt, wenn ich den Vektor ziehbar mit PNGs für jede Dichte und ändern Sie die Schicht-Liste als solche zu ersetzen:

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

Gibt es eine Möglichkeit, dies eine VectorDrawable mit tun können ?

+7

Es scheint, dass dies einfach ein Fehler in API 21/22 sein kann. Ich habe gerade auf einem API 23-Gerät getestet und der Vektor-Zeichensatz wurde korrekt zentriert. – ashughes

+0

Sie sollten Ihre eigene Frage beantworten und akzeptieren. So ist es sichtbarer und die Frage erscheint nicht als unbeantwortet. –

+1

Ich habe meine Frage nicht beantwortet, weil ich noch keine Antwort auf API 21/22 habe. Meine vorübergehende Lösung bestand darin, PNGs anstelle von Vektoren zu verwenden. In der Hoffnung, immer noch einen Weg zu finden, um Vektoren zum Laufen zu bringen. – ashughes

Antwort

8

Ich stieß auf das gleiche Problem, das versucht, Vektoren auf einer geschichteten Liste zu zentrieren.

Ich habe eine Abhilfe, es ist nicht genau das gleiche, aber es funktioniert, benötigen Sie eine Größe für die gesamte ziehbar setzen und Polsterung an den Vektor Element hinzufügen:

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

Die Größe der Form über Sätze Die Größe des gesamten Zeichensatzes, 120 dpi in diesem Beispiel, das Auffüllen des zweiten Elements, in diesem Beispiel 24 dpi, zentriert das Vektorbild.

Es ist nicht das gleiche wie die gravity="center" verwenden, aber seine Arbeits Art und Weise Vektoren mit in API 21 und 22

+1

Dies klingt so, als müssten Sie die genaue Größe des Zeichenobjekts kennen (um die Formgröße festzulegen), anstatt es den gesamten Platz einzunehmen, auf den es gesetzt wurde, und zwar mit dem Zeichen, das zentriert in ihm zentriert werden kann. – ashughes

+0

Es ist möglich, die Größe nicht zu kennen, aber Sie können die Auffüllung mit dieser Methode nicht ändern, Sie könnten die Zeichen in Bildansichten übereinander legen. Wie oben erwähnt, gibt es in API 21 und 22 keine perfekte Lösung für ein 'gravity =" center "'. –

9

worden mit dem gleichen Problem zu kämpfen. Der einzige Weg, fand ich dieses Problem beheben und die ziehbar zu vermeiden bis zu skalieren war die ziehbar Größe einzustellen und mit der Schwerkraft sie richten:

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

Hoffe, es hilft!

+13

Dies hilft nicht bei API 21-22, da das Attribut 'width' auf diesen API-Ebenen nicht verfügbar ist. In API 23 werden diese nicht benötigt, da der Fehler behoben ist und das Zeichen nicht mehr gestreckt ist. – WonderCsabo

+0

es funktioniert nicht mehr! –

Verwandte Themen