2013-01-21 1 views
51

Je ne comprends pas comment fonctionnent les listes de calques. J'ai lu le documentation with some examples officiel mais cela ne fonctionne pas pour moi comme prévu. Je veux quatre carrés qui devraient être rembourrés avec 1dp, mais rien n'est comme prévu. Voici une capture d'écran à l'échelle de 500%:Comprendre Android <layer-list>

My suares
(Les mauvaises couleurs ne comptent pas)
Comme vous pouvez voir la taille est complètement faux et les rembourrages sont manquants. J'ai essayé de définir de vraies valeurs comme width/height et right/left/top/buttom pour être sûr que Android obtienne le point que je veux.

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

Comment avez-vous fait la capture d'écran? Parce que l'image qu'elle me donne semble absolument correcte ... – OcuS

+0

J'ai pris l'éditeur visuel d'eclipse. – rekire

+0

@rekire L'éditeur est buggé juste pour que vous sachiez qu'il n'a pas toujours la bonne forme. Toujours vérifier sur l'appareil. –

Répondre

97

Les valeurs de gauche, en haut, à droite et en bas sont mesurés à partir de leur bord respectif. Donc, à gauche = 0dp, top = 0dp, bas = 0dp & right = 50dp vous donnera un rectangle qui est (match_parent - 50dp) large et non 50dp de large. Par conséquent, des valeurs plus grandes pour «droite» vous donneront un rectangle plus petit. La même chose s'appliquerait à l'autre valeur, mais celles-ci se comporteraient comme prévu dans la plupart des cas, c'est juste "juste" qui pourrait causer de la confusion.

+4

Son rembourrage comme en html, droit = ​​50dp ajoute un rembourrage de 50dp à droite. –

+0

comment changer "top = 0dp" dans le code une idée? –

5

Soit vous utilisez px au lieu de multiplier dp ou toutes les dimensions par 10.

J'ai honte d'admettre que je ne sais pas exactement pourquoi cela se passe mais je pense qu'il a quelque chose à voir avec des densités où 1dp est une valeur px flottante et la ImageView est entartré.

réponse Expert est la bienvenue :)

+0

Vous avez raison, mais je voudrais être DPI indépendamment. Pourriez-vous fournir plus d'informations comme si j'avais vraiment besoin de toutes les valeurs du rect (haut, gauche, droite, bas) et une idée pourquoi dp ne semble pas fonctionner en éclipse. – rekire

+3

Je viens de trouver cette réponse encore une fois enfin j'ai utilisé px et utilisé pour d'autres écrans (ldpi, mdpi, hdpi, xhdpi et xxhdpi) d'autres valeurs. – rekire