J'essaie d'utiliser un VectorDrawable
dans un LayerList
sans mettre à l'échelle le vecteur. Par exemple:
<layer-list>
<item android:drawable="@color/grid_item_activated"/>
<item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>
L' ic_check_white_48dp
identifiant drawable défini comme:
<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>
L'effet souhaité est que l'icône de coche soit centrée dans le calque dessinable, sans mise à l'échelle. Le problème est que la liste des calques ci-dessus entraîne la mise à l'échelle de l'icône de vérification pour s'adapter à la taille du calque.
Je peux produire l'effet souhaité si je remplace le vecteur dessiné par des PNG pour chaque densité et que je modifie la liste des calques en tant que telle:
<layer-list>
<item android:drawable="@color/grid_item_activated"/>
<item>
<bitmap android:gravity="center" android:src="@drawable/ic_check_white_48dp"/>
</item>
</layer-list>
Est-il possible de faire cela en utilisant un VectorDrawable
?
Réponses:
J'ai rencontré le même problème en essayant de centrer les vecteurs drawables sur une liste en couches.
J'ai une solution de contournement, ce n'est pas exactement la même chose mais cela fonctionne, vous devez définir une taille pour l'ensemble du dessinable et ajouter un rembourrage à l'élément vectoriel:
La taille de la forme ci-dessus définit la taille de l'ensemble du dessinable, 120dp dans cet exemple, le remplissage sur le deuxième élément, 24dp dans cet exemple, centre l'image vectorielle.
Ce n'est pas la même chose que d'utiliser le
gravity="center"
mais sa façon de travailler d'utiliser les vecteurs dans l'API 21 et 22.la source
gravity="center"
API 21 et 22.windowBackground
. Les tailles explicites ne font rien dans ce cas. Et cela ne fonctionne pas non plus si je mets la liste de couches dans une autre liste de couches.J'ai été aux prises avec le même problème. Le seul moyen que j'ai trouvé pour résoudre ce problème et éviter que le dessin ne soit mis à l'échelle était de définir la taille du dessin et d'utiliser la gravité pour l'aligner:
J'espère que ça aide!
la source
width
attribut n'est pas disponible sur ces niveaux d'API. Sur l'API 23, ceux-ci ne sont pas nécessaires, car le bogue est corrigé et le dessin n'est plus étiré.Solution modifiée qui donnera à votre SplashScreen une belle apparence sur toutes les API, y compris API21 à API23
Tout d'abord, lisez cet article et suivez la BONNE façon de créer un écran de démarrage.
Si votre logo est déformé ou ne convient pas et que vous ciblez uniquement les API24 +, vous pouvez simplement réduire votre vecteur dessiné directement dans son fichier xml comme ceci:
dans le code ci-dessus, je redimensionne un dessinable que j'ai dessiné sur une toile 640x640 pour être 240x240. alors je viens de le mettre dans mon écran de démarrage dessiné comme ça et cela fonctionne très bien:
mon code ne dessine en fait que le triangle dans l'image en bas, mais ici vous voyez ce que vous pouvez réaliser avec cela. La résolution est enfin excellente par rapport aux bords pixélisés que j'obtenais lors de l'utilisation de bitmap. alors utilisez un vecteur dessinable par tous les moyens (il existe un site appelé vectr que j'ai utilisé pour créer le mien sans avoir à télécharger un logiciel spécialisé).
EDIT afin de le faire fonctionner également sur API21-22-23
Bien que la solution ci-dessus fonctionne pour les appareils exécutant API24 +, j'ai été vraiment déçu après avoir installé mon application sur un appareil exécutant API22. J'ai remarqué que l'écran de démarrage essayait à nouveau de remplir la vue entière et ressemblait à de la merde. Après avoir arraché mes sourcils pendant une demi-journée, j'ai finalement forcé brutalement une solution par pure volonté.
vous devez créer un deuxième fichier nommé exactement comme le splashscreen xml (disons splash_screen.xml) et le placer dans 2 dossiers appelés drawable-v22 et drawable-v21 que vous créerez dans le dossier res / (pour les voir, vous devez changer la vue de votre projet d'Android en Projet). Cela sert à dire à votre téléphone de rediriger vers les fichiers placés dans ces dossiers chaque fois que l'appareil concerné exécute une API correspondant au suffixe -vXX dans le dossier pouvant être dessiné, voir ce lien . placez le code suivant dans la liste des couches du fichier splash_screen.xml que vous créez dans ces dossiers:
Pour une raison quelconque pour ces API, vous devez envelopper votre dessinable dans un bitmap afin de le faire fonctionner et de donner le même résultat au résultat final. Le problème est que vous devez utiliser l'approche avec les dossiers dessinables supplémentaires car la deuxième version du fichier splash_screen.xml entraînera que votre écran de démarrage ne s'affiche pas du tout sur les appareils exécutant des API supérieures à 23. Vous devrez peut-être également placer la première version de splash_screen.xml dans drawable-v24 car Android utilise par défaut le dossier drawable-vXX le plus proche qu'il peut trouver pour les ressources.
la source
Je travaille actuellement sur un écran de démarrage avec un dessin vectoriel centré à la fois horizontalement et verticalement. Voici ce que j'ai obtenu au niveau de l'API 25:
Si vous souhaitez ajuster la dimension du dessin vectoriel, les modifier
android:width
et lesandroid:height
attributs ci-dessus, ne modifiez pas nécessairement le dessinable d'origine.De plus, mon expérience est de NE PAS mettre le vecteur dessinable dans une balise bitmap, ce qui ne fonctionne jamais pour moi. Bitmap est destiné aux fichiers au format .png, .jpg et .gif, pas aux fichiers vectoriels.
Référence
https://developer.android.com/guide/topics/resources/drawable-resource#LayerList
https://developer.android.com/guide/topics/resources/more-resources.html#Dimension
la source