Image de coins arrondis dans Flutter


122

J'utilise Flutter pour faire une liste d'informations sur les films. Maintenant, je veux que l'image de couverture sur la gauche soit une image aux coins arrondis. J'ai fait ce qui suit, mais cela n'a pas fonctionné. Merci!

    getItem(var subject) {
    var row = Container(
      margin: EdgeInsets.all(8.0),
      child: Row(
        children: <Widget>[
          Container(
            width: 100.0,
            height: 150.0,
            decoration: BoxDecoration(
              borderRadius: BorderRadius.all(Radius.circular(8.0)),
              color: Colors.redAccent,
            ),
            child: Image.network(
              subject['images']['large'],
              height: 150.0,
              width: 100.0,
            ),
          ),
        ],
      ),
    );
    return Card(
      color: Colors.blueGrey,
      child: row,
    );
  }

comme suit

entrez la description de l'image ici


Avez-vous compris pourquoi cette méthode ne fonctionne pas?
Martin

Réponses:


356

Utilisez ClipRRect-le fonctionnera parfaitement

ClipRRect(
    borderRadius: BorderRadius.circular(8.0),
    child: Image.network(
        subject['images']['large'],
        height: 150.0,
        width: 100.0,
    ),
)

9
Merci ! Je l'ai fait comme vous l'avez dit, puis ajouté fit: BoxFit.fill, ça a l'air plutôt bien.
Liu Silong

2
Merci - avez-vous une idée sur la façon de créer une bordure colorée sur l'image clipRRect'ed?
iKK

3
@iKK - Enveloppez-le dans un conteneur avec un BoxDecoration avec les accessoires border / borderRadius appropriés comme suit: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(3.0), border: Border.all(color: Colors.grey[300])), child: ClipRRect( borderRadius: BorderRadius.circular(3.0), child: Image.network( uri, fit: BoxFit.fill, width: imageDimension, height: imageDimension, ), ), )
Daniel Allen

1
merci, un conseil: fonctionne uniquement avec une même largeur et hauteur
Álvaro Agüero

50

Vous pouvez également utiliser CircleAvatar, qui vient avec scintillement

CircleAvatar(
  radius: 20,
  backgroundImage: NetworkImage('https://via.placeholder.com/140x100')
)

2
C'est la meilleure réponse. J'ai fait extrabackgroundImage: member[index].picture == null ? Image(image: AssetImage('assests/no-image.png')) : NetworkImage( member[index].picture,
saviour123

@ saviour123 toutes les images aux coins arrondis ne sont pas un «avatar». La réponse générique est acceptée.
nipunasudha

Impossible de définir une hauteur ou une largeur avec ce widget, ce qui pose problème.
papillon le

38

En utilisant, ClipRRectvous devez coder en dur BorderRadius, donc si vous avez besoin de trucs circulaires complets, utilisez ClipOvalplutôt.

ClipOval(
  child: Image.network(
    "image_url",
    height: 100,
    width: 100,
    fit: BoxFit.cover,
  ),
),

2
La réponse la plus simple!
Alvin Konda le

1
si l'image enfant n'est pas carrée, le découpage sera elliptique dans cette solution.
Bilal Şimşek

29

Essayez plutôt ceci, a fonctionné pour moi:

Container(
  width: 100.0,
  height: 150.0,
  decoration: BoxDecoration(
    image: DecorationImage(
        fit: BoxFit.cover, image: NetworkImage('Path to your image')),
    borderRadius: BorderRadius.all(Radius.circular(8.0)),
    color: Colors.redAccent,
  ),
),

Votre réponse est vraiment utile, merci! Mais que se passe-t-il si le contenu d'un conteneur n'est pas seulement une image mais un widget? Une idée?
Oleksandr

13
   Container(
      width: 48.0,
      height: 48.0,
      decoration: new BoxDecoration(
        shape: BoxShape.circle,
        image: new DecorationImage(
            fit: BoxFit.fill,
            image: NetworkImage("path to your image")
        )
    )),

5

Pour l'image, utilisez ceci

ClipOval(
    child: Image.network(
        'https://url to your image',
        fit: BoxFit.fill,
    ),
);

Alors que pour Asset Image, utilisez ceci

ClipOval(
    child: Image.asset(
        'Path to your image',
        fit: BoxFit.cover,
    ),
)

1
J'ai déjà utilisé ceci comme réponse, vous n'avez rien fourni d'utile. -1 de moi.
CopsOnRoad

4

Avec la nouvelle version du flutter et du thème matériel, vous devez également utiliser le widget "Padding" pour avoir une image qui ne remplit pas son conteneur.

Par exemple, si vous souhaitez insérer une image arrondie dans l'AppBar, vous devez utiliser un remplissage ou votre image sera toujours aussi haute que l'AppBar.

J'espère que cela aidera quelqu'un

InkWell(
        onTap: () {
            print ('Click Profile Pic');
        },
        child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: ClipOval(
                child: Image.asset(
                    'assets/images/profile1.jpg',
                ),
            ),
        ),
    ),

3

vous pouvez utiliser ClipRRect comme ceci:

  Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ClipRRect(
                    borderRadius: BorderRadius.circular(25),
                    child: Image.asset(
                      'assets/images/pic13.jpeg',
                      fit: BoxFit.cover,
                    ),
                  ),
                )

vous pouvez définir votre rayon, ou l'utilisateur pour uniquement pour topLeft ou en bas à gauche comme:

Padding(
              padding: const EdgeInsets.all(8.0),
              child: ClipRRect(
                borderRadius: BorderRadius.only(
                    topLeft: Radius.circular(25)
                ,bottomLeft: Radius.circular(25)),
                child: Image.asset(
                  'assets/images/pic13.jpeg',
                  fit: BoxFit.cover,
                ),
              ),
            )

2

Utilisez ClipRRect avec la propriété d'image définie de fit: BoxFit.fill

ClipRRect(
          borderRadius: new BorderRadius.circular(10.0),
          child: Image(
            fit: BoxFit.fill,
            image: AssetImage('images/image.png'),
            width: 100.0,
            height: 100.0,
          ),
        ),

1

Utilisez ClipRRect, cela résoudra votre problème.

      ClipRRect(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
              child: Image.network(
                Constant.SERVER_LINK + model.userProfilePic,
                fit: BoxFit.cover,
              ),
            ),

0

Utilisez cette méthode dans ce cercle, l'image fonctionne également + vous avez également un préchargeur pour l'image réseau:

new ClipRRect(
     borderRadius: new BorderRadius.circular(30.0),
     child: FadeInImage.assetNetwork(
          placeholder:'asset/loader.gif',
          image: 'Your Image Path',
      ),
    )

0

Essayez ceci, cela fonctionne bien.

Container(
  height: 220.0,
  width: double.infinity,
  decoration: BoxDecoration(
    borderRadius: new BorderRadius.only(
      topLeft: Radius.circular(10),
       topRight: Radius.circular(10),
    ),
    image: DecorationImage(
      fit: BoxFit.fill,
      image: NetworkImage(
        photoUrl,
      ),
     ),
   ),
);

-1

décoration utilisateur Image pour un conteneur.

  @override
  Widget build(BuildContext context) {
    final alucard = Container(
        decoration: new BoxDecoration(
        borderRadius: BorderRadius.circular(10),
          image: new DecorationImage(
              image: new AssetImage("images/logo.png"),
              fit: BoxFit.fill,
          )
        )
    );
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.