Je voudrais créer une forme qui ressemble à l'image suivante:
Remarquez les dégradés de la moitié supérieure de la couleur 1 à la couleur 2, mais il y a une moitié inférieure qui dégradé de la couleur 3 à la couleur 4. Je sais comment créer une forme avec un seul dégradé, mais je ne sais pas comment diviser une forme en deux moitiés et faites 1 forme avec 2 dégradés différents.
Des idées?
Réponses:
Je ne pense pas que vous puissiez le faire en XML (du moins pas sous Android), mais j'ai trouvé une bonne solution publiée ici qui semble être d'une grande aide!
Fondamentalement, le tableau int vous permet de sélectionner plusieurs arrêts de couleur, et le tableau flottant suivant définit où ces arrêts sont positionnés (de 0 à 1). Vous pouvez ensuite, comme indiqué, simplement l'utiliser comme un Drawable standard.
Edit: Voici comment vous pouvez utiliser cela dans votre scénario. Disons que vous avez un bouton défini en XML comme ceci:
Vous mettriez ensuite quelque chose comme ça dans votre méthode onCreate ():
Je ne peux pas tester cela pour le moment, c'est du code de ma tête, mais en gros, remplacez ou ajoutez des arrêts pour les couleurs dont vous avez besoin. Fondamentalement, dans mon exemple, vous commenceriez par un vert clair, un fondu au blanc légèrement avant le centre (pour donner un fondu, plutôt qu'une transition dure), un fondu du blanc au vert moyen entre 45% et 55%, puis un fondu de vert moyen à vert foncé de 55% à la fin. Cela peut ne pas ressembler exactement à votre forme (pour le moment, je n'ai aucun moyen de tester ces couleurs), mais vous pouvez le modifier pour reproduire votre exemple.
Edit: En outre, le
0, 0, 0, theButton.getHeight()
fait référence aux coordonnées x0, y0, x1, y1 du dégradé. Donc, fondamentalement, cela commence à x = 0 (côté gauche), y = 0 (en haut) et s'étire jusqu'à x = 0 (nous voulons un dégradé vertical, donc aucun angle de gauche à droite n'est nécessaire), y = la hauteur du bouton. Ainsi, le dégradé va à un angle de 90 degrés du haut du bouton au bas du bouton.Edit: D'accord, j'ai donc une autre idée qui fonctionne, haha. À l'heure actuelle, cela fonctionne en XML, mais devrait également être faisable pour les formes en Java. C'est un peu complexe, et j'imagine qu'il existe un moyen de le simplifier en une seule forme, mais c'est ce que j'ai pour le moment:
green_horizontal_gradient.xml
half_overlay.xml
layer_list.xml
test.xml
D'accord, j'ai donc créé un dégradé de forme en XML pour le dégradé vert horizontal, défini à un angle de 0 degré, allant de la couleur verte gauche de la zone supérieure à la couleur verte droite. Ensuite, j'ai fait un rectangle de forme avec un gris semi-transparent. Je suis presque sûr que cela pourrait être intégré dans le XML de la liste de couches, évitant ce fichier supplémentaire, mais je ne sais pas comment. Mais d'accord, alors le genre de partie piratée entre dans le fichier XML layer_list. J'ai mis le dégradé vert comme couche inférieure, puis la demi-superposition comme deuxième couche, décalée du haut de 50dp. De toute évidence, vous voudriez que ce nombre soit toujours la moitié de la taille de votre vue, et non un 50dp fixe. Je ne pense pas que vous puissiez utiliser des pourcentages, cependant. À partir de là, je viens d'insérer un TextView dans ma mise en page test.xml, en utilisant le fichier layer_list.xml comme arrière-plan.
Tada!
Une dernière modification : j'ai réalisé que vous pouvez simplement incorporer les formes dans la liste des calques dessinables en tant qu'éléments, ce qui signifie que vous n'avez plus besoin de 3 fichiers XML séparés! Vous pouvez obtenir le même résultat en les combinant comme ceci:
layer_list.xml
Vous pouvez superposer autant d'éléments que vous le souhaitez de cette façon! Je peux essayer de jouer et voir si je peux obtenir un résultat plus polyvalent grâce à Java.
Je pense que c'est la dernière modification ... : D'accord, vous pouvez donc définitivement corriger le positionnement via Java, comme suit:
Toutefois! Cela conduit à un autre problème ennuyeux en ce que vous ne pouvez pas mesurer le TextView avant qu'il n'ait été dessiné. Je ne sais pas encore comment vous pouvez accomplir cela ... mais l'insertion manuelle d'un numéro pour topInset fonctionne.
J'ai menti, encore une modification
OK, découvrez comment mettre à jour manuellement cette couche dessinable pour qu'elle corresponde à la hauteur du conteneur, une description complète peut être trouvée ici . Ce code devrait aller dans votre méthode onCreate ():
Et j'ai fini! Ouf! :)
la source
Vous pouvez superposer des formes de dégradé dans le xml en utilisant une liste de calques. Imaginez un bouton avec l'état par défaut comme ci-dessous, où le deuxième élément est semi-transparent. Cela ajoute une sorte de vignettage. (Veuillez excuser les couleurs personnalisées.)
la source
Vous POUVEZ le faire en utilisant uniquement des formes xml - utilisez simplement une liste de calques ET un remplissage négatif comme ceci:
la source
Essayez cette méthode, vous pouvez faire tout ce que vous voulez.
C'est comme une pile, alors faites attention à quel élément vient en premier ou en dernier.
la source
Avez-vous essayé de superposer un dégradé avec une opacité presque transparente pour la surbrillance sur une autre image avec une opacité opaque pour le dégradé vert?
la source