Image d'arrière-plan du jeu de SDK Flutter


122

J'essaie de définir une image d'arrière-plan pour la page d'accueil. J'obtiens la place de l'image depuis le début de l'écran et remplis la largeur mais pas la hauteur. Est-ce que je manque quelque chose dans mon code? Existe-t-il des normes d'image pour le scintillement? Les images sont-elles mises à l'échelle en fonction de la résolution d'écran de chaque téléphone?

class BaseLayout extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return new Scaffold(
      body: new Container(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            new Image.asset("assets/images/bulb.jpg") 
          ]
        )
      )
    );
  }
}

quelle devrait être la taille de l'image? largeur hauteur?
ArgaPK

Quelqu'un peut-il donner un exemple avec un appel d'image réseau
The Dead Guy

1
@TheDeadGuy Image.network (' example.com/path/to/image.jpg' )?
SacWebDeveloper

solution de paiement ici sur ce lien stackoverflow.com/a/62245570/9955978
Shubham Sharma

Aucun des commentaires mentionnés n'a aidé dans mon cas - veuillez ne pas demander pourquoi. Voici un lien utile avec des explications: educity.app/flutter/…
boldnik

Réponses:


332

Je ne suis pas sûr de comprendre votre question, mais si vous voulez que l'image remplisse tout l'écran, vous pouvez utiliser un DecorationImageavec un ajustement de BoxFit.cover.

class BaseLayout extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          image: DecorationImage(
            image: AssetImage("assets/images/bulb.jpg"),
            fit: BoxFit.cover,
          ),
        ),
        child: null /* add child content here */,
      ),
    );
  }
}

Pour votre deuxième question, voici un lien vers la documentation sur la façon d'intégrer des images d'actifs dépendant de la résolution dans votre application.


8
Cela fonctionne tant que vous n'avez pas d'enfant. Si vous ajoutez un enfant, la taille du conteneur est réduite à la taille de son enfant. Savez-vous comment faire en sorte que le conteneur remplisse tout l'écran quelle que soit la taille de son enfant?
HyLian

@ColinJackson quelle devrait être la taille de l'image? largeur hauteur?
ArgaPK

4
@HyLian définit la propriété des contraintes du conteneur,constraints: BoxConstraints.expand()
Rustem Kakimov

2
Pour l'image réseau, on peut utiliserDecorationImage(image: Image.network("http://example.com/image.jpg").image, ...)
Eugene Gr. Philippov

@HyLian ajoute width: double.infinityau conteneur avec l'image.
jkoech

45

Si vous utilisez a Containercomme corps de Scaffold, sa taille sera en conséquence la taille de son enfant, et ce n'est généralement pas ce que vous voulez lorsque vous essayez d'ajouter une image d'arrière-plan à votre application.

En regardant cette autre question, @ collin-jackson suggérait également d'utiliser à la Stackplace de Containercomme corps du Scaffoldet il fait certainement ce que vous voulez réaliser.

Voici à quoi ressemble mon code

@override
Widget build(BuildContext context) {
  return new Scaffold(
    body: new Stack(
      children: <Widget>[
        new Container(
          decoration: new BoxDecoration(
            image: new DecorationImage(image: new AssetImage("images/background.jpg"), fit: BoxFit.cover,),
          ),
        ),
        new Center(
          child: new Text("Hello background"),
        )
      ],
    )
  );
}

quelle devrait être la taille de l'image? largeur hauteur?
ArgaPK

5
L'ouverture du clavier redimensionne l'image. Que peut-on faire pour cela?
Michael Hathi

15

Vous pouvez utiliser DecoratedBox.

@override
Widget build(BuildContext context) {
  return DecoratedBox(
    decoration: BoxDecoration(
      image: DecorationImage(image: AssetImage("your_asset"), fit: BoxFit.cover),
    ),
    child: Center(child: FlutterLogo(size: 300)),
  );
}

Production:

entrez la description de l'image ici


11

Vous pouvez utiliser Stackpour étirer l'image en plein écran.

Stack(
        children: <Widget>
        [
          Positioned.fill(  //
            child: Image(
              image: AssetImage('assets/placeholder.png'),
              fit : BoxFit.fill,
           ),
          ), 
          ...... // other children widgets of Stack
          ..........
          .............
         ]
 );

Remarque: En option, si vous utilisez a Scaffold, vous pouvez placer l' Stackintérieur Scaffoldavec ou sans AppBarselon vos besoins.


Exactement ce dont j'avais besoin, dans mon cas, mon image est à l'intérieur d'un ShaderMask, donc ça ne marcherait pas de mettre un image:nom.
Soon Santos le

5

J'ai pu appliquer un arrière-plan sous le Scaffold(et même c'est AppBar) en mettant le Scaffoldsous a Stacket en définissant un Containerdans le premier "calque" avec le jeu d'image d'arrière-plan et la fit: BoxFit.coverpropriété.

Le Scaffoldet AppBardoit avoir la valeur backgroundColordéfinie comme Color.transparentet le elevationde AppBardoit être 0 (zéro).

Voilà! Vous avez maintenant un joli fond sous l'ensemble de l'échafaudage et de l'AppBar! :)

import 'package:flutter/material.dart';
import 'package:mynamespace/ui/shared/colors.dart';
import 'package:mynamespace/ui/shared/textstyle.dart';
import 'package:mynamespace/ui/shared/ui_helpers.dart';
import 'package:mynamespace/ui/widgets/custom_text_form_field_widget.dart';

class SignUpView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Stack( // <-- STACK AS THE SCAFFOLD PARENT
      children: [
        Container(
          decoration: BoxDecoration(
            image: DecorationImage(
              image: AssetImage("assets/images/bg.png"), // <-- BACKGROUND IMAGE
              fit: BoxFit.cover,
            ),
          ),
        ),
        Scaffold(
          backgroundColor: Colors.transparent, // <-- SCAFFOLD WITH TRANSPARENT BG
          appBar: AppBar(
            title: Text('NEW USER'),
            backgroundColor: Colors.transparent, // <-- APPBAR WITH TRANSPARENT BG
            elevation: 0, // <-- ELEVATION ZEROED
          ),
          body: Padding(
            padding: EdgeInsets.all(spaceXS),
            child: Column(
              children: [
                CustomTextFormFieldWidget(labelText: 'Email', hintText: 'Type your Email'),
                UIHelper.verticalSpaceSM,
                SizedBox(
                  width: double.maxFinite,
                  child: RaisedButton(
                    color: regularCyan,
                    child: Text('Finish Registration', style: TextStyle(color: white)),
                    onPressed: () => {},
                  ),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

3

Nous pouvons utiliser Container et marquer sa hauteur comme infini

body: Container(
      height: double.infinity,
      width: double.infinity,
      child: FittedBox(
        fit: BoxFit.cover,
        child: Image.network(
          'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
        ),
      ),
    ));

Production:

entrez la description de l'image ici


2
decoration: BoxDecoration(
      image: DecorationImage(
        image: ExactAssetImage("images/background.png"),
        fit: BoxFit.cover
      ),
    ),

cela fonctionne également à l'intérieur d'un conteneur.


-1

Pour définir une image d'arrière-plan sans réduire après l'ajout de l'enfant, utilisez ce code.

  body: Container(
    constraints: BoxConstraints.expand(),
      decoration: BoxDecoration(
        image: DecorationImage(
            image: AssetImage("assets/aaa.jpg"),
        fit: BoxFit.cover,
        )
      ),

    //You can use any widget
    child: Column(
      children: <Widget>[],
    ),
    ),

-1
body: Container(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: AssetImage('images/background.png'),fit:BoxFit.cover
      )
    ),
);

La réponse fournie a été signalée pour examen en tant que publication de faible qualité. Voici quelques conseils pour Comment rédiger une bonne réponse? . Cette réponse fournie pourrait bénéficier d'une explication. Les réponses codées uniquement ne sont pas considérées comme «bonnes».
Trenton McKinney
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.