57 votes

flutter - Comment créer un bouton en relief avec un fond en dégradé ?

Existe-t-il un moyen de changer la couleur d'arrière-plan du bouton en relief en un dégradé ? Sinon, comment puis-je réaliser quelque chose comme ça ?

0 votes

Par le passé, j'ai eu des difficultés à ajouter un dégradé d'arrière-plan à une zone d'éclaboussures d'encre. Le dégradé finit par cacher les éclaboussures. Souhaitez-vous simplement avoir un dégradé ou un dégradé avec un effet d'éclaboussure ? (pour ce qui est d'un bouton avec une élévation, un rayon de bordure et un dégradé, oui, c'est possible).

0 votes

@AshtonThomas Comme vous l'avez dit, le dégradé cache la tâche d'encre. Cela est dû au fait que la tâche d'encre a besoin d'un widget Material comme parent. J'ai eu la même situation. J'ai donc fini par créer mon propre bouton personnalisé.

0 votes

J'ai essayé l'idée du bouton personnalisé et je n'arrive pas à mettre en place l'animation de l'ombre que le bouton en relief par défaut a ! Pourriez-vous m'aider ?

77voto

bonnyz Points 86

Toutes les solutions ci-dessus ne fonctionnent pas vraiment sans quelques artefacts ou problèmes mineurs (par exemple, l'absence d'effet d'ondulation, des bordures indésirables, le non-respect de la charte du thème, etc. minWidth pour les boutons).

Le site La solution ci-dessous ne présente aucun des problèmes ci-dessus (la partie critique est d'utiliser le Ink pour conserver les capacités d'ondulation sur le gradient) :

RaisedButton(
  onPressed: () { },
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)),
  padding: const EdgeInsets.all(0.0),
  child: Ink(
    decoration: const BoxDecoration(
      gradient: myGradient,
      borderRadius: BorderRadius.all(Radius.circular(80.0)),
    ),
    child: Container(
      constraints: const BoxConstraints(minWidth: 88.0, minHeight: 36.0), // min sizes for Material buttons
      alignment: Alignment.center,
      child: const Text(
        'OK',
        textAlign: TextAlign.center,
      ),
    ),
  ),
)

enter image description here

1 votes

RaisedButton est maintenant déprécié. Utilisez ElevatedButton solution

0 votes

J'ai utilisé cette solution sur MaterialButton et cela fonctionne parfaitement !

64voto

Vamsi Krishna Points 13206

Vous pouvez créer vous-même un modèle personnalisé

class RaisedGradientButton extends StatelessWidget {
  final Widget child;
  final Gradient gradient;
  final double width;
  final double height;
  final Function onPressed;

  const RaisedGradientButton({
    Key key,
    @required this.child,
    this.gradient,
    this.width = double.infinity,
    this.height = 50.0,
    this.onPressed,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: width,
      height: 50.0,
      decoration: BoxDecoration(gradient: gradient, boxShadow: [
        BoxShadow(
          color: Colors.grey[500],
          offset: Offset(0.0, 1.5),
          blurRadius: 1.5,
        ),
      ]),
      child: Material(
        color: Colors.transparent,
        child: InkWell(
            onTap: onPressed,
            child: Center(
              child: child,
            )),
      ),
    );
  }
}

Et utilisez-le partout comme suit :

RaisedGradientButton(
  child: Text(
    'Button',
    style: TextStyle(color: Colors.white),
  ),
  gradient: LinearGradient(
    colors: <Color>[Colors.green, Colors.black],
  ),
  onPressed: (){
    print('button clicked');
  }
),

Custom button

Vous pouvez encore jouer avec l'ombre et les bords arrondis en modifiant la propriété de décoration du conteneur jusqu'à ce qu'elle corresponde à vos spécifications.

0 votes

En fait, je veux que l'ombre soit exactement comme le bouton en relief par défaut et je n'ai pas pu implémenter cela.

0 votes

Vamsi, @MoeinHosseini, essayez d'utiliser l'ajout d'un elevation au matériau plutôt qu'une ombre

16voto

Krishna Lohiya Points 11

Voir ci-dessous -

RaisedButton(
     onPressed: () {},
     textColor: Colors.white,
     padding: const EdgeInsets.all(0.0),
     shape:RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)),
     child: Container(
       decoration: const BoxDecoration(
         gradient: LinearGradient(
           colors: <Color>[
             Color(0xFF0D47A1),
             Color(0xFF1976D2),
             Color(0xFF42A5F5),
           ],
         ),
         borderRadius: BorderRadius.all(Radius.circular(80.0))
       ),
       padding: const EdgeInsets.fromLTRB(20, 10, 20, 10),
       child: const Text(
           'Gradient Button',
           style: TextStyle(fontSize: 20)
       ),
     ),
   )

8voto

ldalonzo Points 523

La documentation sur l'API de Flutter contient un exemple de la façon de rendre une RaisedButton avec fond dégradé - voir ici https://api.flutter.dev/flutter/material/RaisedButton-class.html

Widget gradientButton = Container(
  child: RaisedButton(
    onPressed: () { },
    textColor: Colors.white,
    padding: const EdgeInsets.all(0.0),
    child: Container(
      width: 300,
      decoration: new BoxDecoration(
        gradient: new LinearGradient(
          colors: [
            Color.fromARGB(255, 148, 231, 225),
            Color.fromARGB(255, 62, 182, 226)
          ],
        )
      ),
      padding: const EdgeInsets.all(10.0),
      child: Text(
        "Gradient Button",
        textAlign: TextAlign.center,
      ),
    ),
  ),
);

Gradient Button

1 votes

Question sans rapport avec le sujet. Quelle police utilisez-vous avec ce bouton ?

3 votes

@AsyrafDayan Montserrat

7voto

Shyju Madathil Points 582

Gradient est disponible dans le magasin de pubs et supporte quelques gradients prédéfinis.

Vous pouvez créer le bouton de gradient comme

GradientButton(
                 child: Text('Gradient'),
                 callback: () {},
                 gradient: Gradients.backToFuture,
           ),

Le paquet contient GradientCard, GradientProgressIndicator, GradientButton, CircularGradientButton et GradientText.

Widgets en dégradé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X