Je fais un <layer-list>
pour drawable.
J'ai mon image de fond et je veux que la deuxième couche soit plus petite, Mais il semble que peu importe ce que j'écris dans mes Android:layer_width
et Android:layer_height
La taille de la seconde couche est toujours la même.
Voici mon xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<item
Android:drawable="@drawable/picuser"
Android:layout_width="50dp"
Android:layout_height="50dp" />
<item
Android:drawable="@drawable/ic_launcher"
Android:layout_width="10dp"
Android:layout_height="10dp" />
</layer-list>
J'espère que cela vous a mis dans la bonne direction:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/picuser"/>
<item>
<bitmap
Android:src="@drawable/ic_launcher"
Android:gravity="center" />
</item>
</layer-list>
Comme vous pouvez le voir ici , <item>
n'a pas d'attribut layout_width
/layout_height
.
C'est une sorte de solution de contournement, mais cela a fonctionné pour moi.
Vous pouvez utiliser un rembourrage pour rendre le second dessinable plus petit.
<item Android:drawable="@drawable/circyle" />
<item
Android:drawable="@drawable/plus"
Android:top="10dp"
Android:bottom="10dp"
Android:right="10dp"
Android:left="10dp" />
Contrairement à ce que quelqu'un a dit, il existe également des attributs de largeur et de hauteur pour <item>
. Merci à @Entreco d'avoir posté une démonstration de cela.Android:width
et Android:height
pour Drawable
s sont similaires à Android:layout_width
et Android:layout_height
pour View
s, à la différence qu'ils ne peuvent pas être définis sur match_parent
ni wrap_content
, mais vous pouvez obtenir le même comportement de match_parent
en définissant l'attribut Android:gravity
sur left|right
ou start|end
largeur du parent) ou top|bottom
(pour correspondre à la hauteur du parent).
Malheureusement, ces attributs ne sont disponibles que depuis API 23.
Cependant, compte tenu de la méthode ci-dessus que j'ai suggérée à la place de match_parent
et que les attributs Android:width
et Android:height
sont disponibles pour l'élément <size>
(qui doit être placé dans un <shape>
) sans aucune restriction d'API, vous pouvez utiliser une solution de contournement simple:
<layer-list
xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:shape="rectangle">
<size
Android:width="152dp"
Android:height="152dp"/>
<solid
Android:color="#00FFFFFF"/>
</shape>
</item>
<item>
<bitmap
Android:gravity="left|right|top|bottom"
Android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
La solution ci-dessus tire parti d'un <item>
de taille (avec un <shape>
transparent) et d'un non dimensionné (avec un <bitmap>
) pour lequel Android:gravity
est défini sur left|top|right|bottom
et qui correspond aux dimensions des deux parents. Ainsi, la taille réelle du <bitmap>
sera déterminée par celle de l'unique <item>
de taille unique du même parent.
MODIFIER:
Merci à @Emil S, qui a remarqué que la solution ci-dessus ne fonctionnerait pas comme arrière-plan de fenêtre. Il ne fonctionne correctement que comme arrière-plan ou au premier plan d'une vue. Je ne connais pas de raison particulière à un comportement aussi étrange, mais je peux deviner qu'au moment où le système crée une fenêtre avec l'arrière-plan spécifié dans l'attribut Android:windowBackground
, aucune mise en page n'est effectuée car aucun processus n'est encore lancé. Donc, Android finira par rastériser le dessinable à la taille de l'écran et l'étirera pour remplir toute la fenêtre, je pense. Cela expliquerait comment cela pourrait arriver.
MODIFIER:
@ João Carlos a expliqué comment ma solution ne fonctionnerait pas (car elle provoquerait un héritage cyclique) lors de l'utilisation d'une icône adaptative (ces icônes constituées d'un arrière-plan et d'un premier plan, qui prennent en charge les dessinables vectoriels). Cependant, son propos n’a aucun sens, car les icônes adaptatives requièrent API 26: on pourrait utiliser directement Android:width
et Android:height
sur l’écran d’accueil ou quelque chose du genre (ils ont simplement besoin de API 23).
Donc, pour que quelque chose fonctionne dans toutes les versions d'Android, vous devrez différencier deux dessinables, le premier pour API <23, en utilisant la solution que j'ai publiée et le dernier pour API> = 23, en utilisant les deux attributs comme je l'ai dit il y a quelques lignes de texte.
À partir du niveau 23 et supérieur de l’API, vous pouvez définir la largeur et la hauteur d’un élément.
<item
Android:drawable="@drawable/splash_logo"
Android:height="100dp"
Android:width="100dp"/>
NOTE: Utilisez Android:width
et Android:height
au lieu de Android:layout_width
et Android:layout_height
J'ai beaucoup essayé, mais je ne trouvais pas de moyen fiable de centrer le logo dans une présentation XML ..__ Enfin, j'ai trouvé la solution de contournement suivante:
mToolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ImageView imageView = (ImageView)mToolbar.findViewById(R.id.logo);
if (mToolbar == null)
return;
int toolbarWidth = mToolbar.getWidth();
int imageWidth = imageView.getWidth();
imageView.setX((toolbarWidth - imageWidth) / 2);
}
});
layout_toolbar.xml:
<Android.support.v7.widget.Toolbar
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/toolbar"
style="@style/Toolbar"
Android:layout_width="match_parent"
Android:layout_height="@dimen/toolbar_height"
Android:background="@drawable/toolbar_background"
Android:focusable="false"
app:titleTextAppearance="@style/AppTheme.Toolbar.Title">
<ImageView
Android:id="@+id/logo"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/toolbar_logo" />
</Android.support.v7.widget.Toolbar>
Essaye ça:
<?xml version="1.0" encoding="utf-8"?>
<!-- The Android:opacity=”opaque” line is critical in preventing a flash
of black as your theme transitions. -->
<layer-list
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:opacity="opaque">
<!-- The background color, preferably the same as your normal theme -->
<item Android:drawable="@Android:color/white" />
<item
Android:height="100dp"
Android:width="100dp"
Android:gravity="center">
<bitmap
Android:src="@drawable/ic_launcher_bc_512"/>
</item>
</layer-list>