2013-01-21 4 views
51

Ich verstehe nicht, wie die Layer-Listen arbeiten. Ich lese die offizielle documentation with some examples, aber es funktioniert nicht für mich wie erwartet. Ich möchte vier Quadrate, die mit 1dp aufgefüllt werden sollten, aber nichts ist wie erwartet. Hier ist ein Screenshot von 500% skaliert:Understanding Android <layer-list>

My suares
(Die falschen Farben spielen keine Rolle)
Wie Sie die Größe sehen kann, ist völlig falsch und die Polsterungen fehlen. Ich habe versucht, reale Werte wie Breite/Höhe und rechts/links/oben/unten zu setzen, um sicher zu sein, dass Android den Punkt bekomme, was ich will.

Hier ist meine xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> 
     <shape android:shape="rectangle"> 
      <size android:width="9dp" 
       android:height="9dp"/> 
      <solid android:color="#f000"/> 
     </shape> 
    </item> 

    <item android:top="1dp" android:left="1dp" android:bottom="5dp" android:right="5dp"> 
     <shape android:shape="rectangle"> 
      <size android:width="3dp" 
       android:height="3dp"/> 
      <solid android:color="#f00"/> 
     </shape> 
    </item> 
    <item android:top="1dp" android:left="5dp" android:bottom="5dp" android:right="1dp"> 
     <shape android:shape="rectangle"> 
      <size android:width="3dp" 
       android:height="3dp"/> 
      <solid android:color="#0f0"/> 
     </shape> 
    </item> 

    <item android:top="5dp" android:left="1dp" android:bottom="1dp" android:right="5dp"> 
     <shape android:shape="rectangle"> 
      <size android:width="3dp" 
       android:height="3dp"/> 
      <solid android:color="#0f0"/> 
     </shape> 
    </item> 
    <item android:top="5dp" android:left="5dp" android:bottom="1dp" android:right="1dp"> 
     <shape android:shape="rectangle"> 
      <size android:width="3dp" 
       android:height="3dp"/> 
      <solid android:color="#f00"/> 
     </shape> 
    </item> 
</layer-list> 
+0

Wie hast du den Screenshot gemacht? weil das Bild es mir absolut korrekt sieht ... – OcuS

+0

Ich habe den visuellen Editor von Eclipse genommen. – rekire

+0

@rekire Der Editor ist fehlerhaft, nur damit Sie wissen, dass nicht immer die richtige Form angezeigt wird. Überprüfen Sie immer das Gerät. –

Antwort

97

Die Werte für links, oben, rechts und unten von ihrer jeweiligen Kante gemessen.

Also links = 0dp, oben = 0dp, unten = 0dp & rechts = 50dp gibt Ihnen ein Rechteck, das (match_parent - 50dp) breit und nicht 50dp breit ist. Daher geben größere Werte für "rechts" Ihnen ein kleineres Rechteck.

Das gleiche würde für den anderen Wert gelten, aber diese würden sich in den meisten Fällen wie erwartet verhalten, es ist einfach "richtig", das Verwirrung stiften könnte.

+4

Sein wie Auffüllen in HTML, rechts = 50dp fügt eine Auffüllung von 50dp auf der rechten Seite hinzu. –

+0

Wie ändere ich "top = 0dp" im Code eine Idee? –

5

Entweder Sie verwenden px statt dp oder alle Dimensionen multiplizieren 10.

Ich schäme mich zu sagen, dass ich nicht genau weiß, warum dies geschieht, aber meine Vermutung ist, dass es mit Dichten etwas zu tun hat, wo 1dp ist ein schwimmender px Wert und die ImageView ist verkalkt.

Expert Antwort empfangen wird :)

+0

Sie haben Recht, aber ich möchte dpi unabhängig sein. Könntest du mir mehr Informationen geben, wenn ich wirklich alle Werte von rect benötige (oben, links, rechts, unten) und eine Idee, warum dp in Eclipse nicht funktioniert? – rekire

+3

Ich habe gerade diese Antwort wieder gefunden, schließlich habe ich px und für andere Bildschirmgrößen (LDPI, MDPI, HDPI, XHDPI und XXDDPI) andere Werte verwendet. – rekire