web-dev-qa-db-fra.com

La taille à dessin ne fonctionne pas

J'ai une forme très simple dont je veux régler la largeur:

<shape Android:shape="rectangle">
    <solid Android:color="@color/orange"/>
    <size Android:width="2dp"/>
</shape>

Cependant, lorsque j'affecte cela à l'arrière-plan d'un EditText, il affiche simplement un arrière-plan orange au lieu d'un rectangle de largeur 2dp. Pourquoi la définition de la taille ne fonctionne-t-elle pas? Je veux créer un dessin transparent avec un rectangle orange sur le côté gauche. J'ai également ceci enveloppé dans un sélecteur:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true">
        <shape Android:shape="rectangle">
            <solid Android:color="@color/orange"/>
            <size Android:width="2dp" Android:height="6dp"/>
        </shape>
    </item>
    <item>
        <shape Android:shape="rectangle">
            <solid Android:color="@Android:color/transparent"/>
        </shape>
    </item>
</selector>

J'ai essayé d'ajouter de la hauteur juste pour voir si cela changerait la taille. Ce n'est pas le cas. C'est comme si elle ignorait complètement la taille. WTF?

36
chubbsondubs

Pour moi, régler la gravité de l'élément sur "centre" a résolu le problème. Par exemple:

<item Android:id="@Android:id/progress" Android:gravity="center">
    <clip>
        <shape>
            <size Android:height="2dp"/>
            <solid Android:color="@color/my_color"/>
        </shape>
    </clip>
</item>
17
Simple UX Apps

Juste pour spécifier la réponse de l'utilisateur983447 - l'attribut size signifie vraiment une proportion. Vous devez définir la taille de toutes les formes dans votre liste de calques et elle sera utilisée en proportion lors de la mise à l'échelle, comme layout_weight attribut de LinearLayout. Il vaut donc mieux le nommer non pas un size mais un weight

Vous trouverez ci-dessous une solution de contournement pour implémenter les lignes blanches supérieure et inférieure sans utiliser l'attribut size:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <shape>
            <solid Android:color="#fff" />
        </shape>
    </item>
    <item Android:top="1dp" Android:bottom="1dp">
        <shape>
            <solid Android:color="#888" />
        </shape>
    </item>
</layer-list>
9
AlexD

Il peut fonctionner avec un foreground. Il semble que vous ne puissiez pas définir la gravité d'un arrière-plan. Mais vous pouvez au premier plan. J'ai vérifié les API 21, 23 et 24 (enfin, avec l'aperçu de la conception de Studio) et les points suivants placent un point de cercle plein sur ImageView.

<shape Android:shape="oval" xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="@color/colorPrimary" />
    <size Android:height="8dp" Android:width="8dp" />
</shape>

Avec l'extrait de mise en page

    <ImageView
            Android:foreground="@drawable/list_new_dot"
            Android:foregroundGravity="right|center_vertical"
            tools:src="@drawable/model_1_sm"
            />

[~ # ~] mise à jour [~ # ~] : Bien qu'il semble fonctionner dans l'outil de conception de mise en page, il n'a pas la même apparence dans le émulateur. MISE À JOUR 2 : Puisque cette réponse a quelques votes, vous voudrez peut-être vérifier ce que j'ai réellement utilisé afin d'afficher un nouveau point indicateur: https://Gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb

8
androidguy

J'ai trouvé la liste de couches très sournoise pour la première fois Androider à cause des éléments suivants. À première vue, la plupart des gens penseraient que les attributs des éléments haut, bas, droite et gauche proviennent du haut, du bas, de la droite et de la gauche. Où une valeur de ce qui suit:

<item Android:top="10dp">

Souhaitez-vous net un point de départ à 10dp du haut du conteneur respectif. Ce n'est pas le cas. Considérez-le comme HORS DU haut, du bas, de la droite, de la gauche. <item Android:top="10dp"> vous rapportera toujours un point de départ à 10dp HORS du haut, mais que se passe-t-il lorsque vous voulez régler le bas?

<item Android:bottom="20dp">

Cela ne vous permettra pas d'obtenir un fond à 20dp du HAUT, plutôt un bas de 20dP HORS DU FOND du conteneur.

Ainsi, par exemple avec un conteneur de 100dp, si vous vouliez un rectangle avec un bord supérieur commençant à 20dp et un bord inférieur à 40dp:

<item Android:top="20" Android:bottom="60dp">
4
user3442825

l'attribut size de la forme fournira la valeur de drawable.getIntrinsicWidth & getIntrinsicHeight.

si le conteneur du dessinable (par exemple ImageView, TextView) a le paramètre de disposition WRAP_CONTENT, la dimension du conteneur changera si le dessin drawable State change.

mais il y a un bogue dans Android framework dans l'implémentation ImageView drawingState

ImageView ne met à jour/redimensionne sa dimension que par la dimension dessinable sur state_selected mais pas sur state_activated

1
user882729

J'ai eu un problème similaire.

La documentation ( http://developer.Android.com/guide/topics/resources/drawable-resource.html#Shape ) dit:

<taille>

La taille de la forme. (...)

Remarque: La forme s'adapte à la taille de la vue du conteneur proportionnellement aux dimensions définies ici, par défaut. Lorsque vous utilisez la forme dans une ImageView, vous pouvez restreindre la mise à l'échelle en définissant Android: scaleType sur "center".

Si je comprends bien, cela signifie que la balise "size" n'est pas pour définir la taille mais pour définir les proportions.

1
user983447

utilisé cela.

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

<stroke
    Android:color="@color/lgray"
    Android:width="1dip" />

<corners
    Android:bottomLeftRadius="0dip"
    Android:bottomRightRadius="0.1dip"
    Android:topLeftRadius="0dip"
    Android:topRightRadius="0.1dip" />

<solid Android:color="@color/White" />

</shape>

mettez ceci rectangle.xml dans drawable.and définissez l'arrière-plan de votre vue.

0
Harshid