web-dev-qa-db-fra.com

Image de fond plein écran dans une activité

Je vois de nombreuses applications qui utilisent une image plein écran comme arrière-plan. Ceci est un exemple:

Full screen background image

Je souhaite l’utiliser dans un projet. La meilleure façon de procéder jusqu’à présent consiste à utiliser une image de grande taille, de la placer dans un fichier ImageView et d’utiliser Android: adjustViewBounds="true" pour ajuster le paramètre. les marges

Le problème est que si un écran avec une résolution très élevée, l'image est insuffisante.

Une autre option à laquelle je pensais est d’utiliser l’image dans un FrameLayout, avec match_parent dans width et height en tant qu’arrière-plan ... ceci étend l’image, mais je pense que le le résultat n'est pas très bon.

Comment le ferais-tu?

138
Sergio76

Il y a plusieurs façons de le faire.

Option 1:

Créez différentes images parfaites pour différents dpi et placez-les dans un dossier pouvant être dessiné. Puis mettre

Android:background="@drawable/your_image

Option 2:

Ajouter une seule grande image. Utilisez FrameLayout. En tant que premier enfant, ajoutez un ImageView. Définissez les éléments suivants dans votre ImageView.

Android:src="@drawable/your_image"
Android:scaleType = "centerCrop"
213
stinepike

Une autre option consiste à ajouter une seule image (pas nécessairement grande) dans les éléments dessinables (appelons-la backgroung.jpg), à créer un ImageView iv_background à la racine de votre xml sans attribut "src". Puis dans la méthode onCreate de l'activité correspondante:

    /* create a full screen window */
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.your_activity);

    /* adapt the image to the size of the display */
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    Bitmap bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(
      getResources(),R.drawable.background),size.x,size.y,true);

    /* fill the background ImageView with the resized image */
    ImageView iv_background = (ImageView) findViewById(R.id.iv_background);
    iv_background.setImageBitmap(bmp);

Pas de recadrage, pas beaucoup d'images de tailles différentes. J'espère que ça aide!

25
axplusb

Vous devriez mettre les images de différentes tailles dans le dossier suivant

pour plus de détails, visitez ceci lien

  • ldpi

  • mdpi

  • hdpi

  • xhdpi

  • xxhdpi

et utiliser l'arrière-plan RelativeLayout ou LinearLayout au lieu d'utiliser ImageView comme exemple suivant

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:layout_width="fill_parent"
 Android:layout_height="fill_parent"
 Android:orientation="vertical"
 Android:background="@drawable/your_image">

</RelativeLayout>
18
Munish Kapoor

Qu'en est-il de

Android:background="@drawable/your_image"

sur la disposition principale de votre activité?

De cette façon, vous pouvez également avoir différentes images pour différentes densités d’écran en les plaçant dans les dossiers res/drawable-**dpi appropriés.

7
NoToast

utilisez ceci

Android:background="@drawable/your_image

dans votre activité, une première mise en page linéaire ou relative.

6
Syed

Si vous souhaitez que votre image affiche AU-DELÀ une barre d’action transparente, définissez les éléments suivants dans la définition de style de votre thème:

<item name="windowActionBarOverlay">true</item>
<item name="Android:windowActionBarOverlay">true</item>

Prendre plaisir!

6
Jens

Cela fait un moment que cela a été posté, mais cela m'a aidé.

Vous pouvez utiliser des mises en page imbriquées. Commencez avec un RelativeLayout et placez votre ImageView dans celui-ci.

Définissez height et width sur match_parent pour remplir l'écran.

Définissez scaleType = "centreCrop" pour que l'image s'adapte à l'écran et ne s'étire pas.

Ensuite, vous pouvez mettre n'importe quelle autre disposition comme vous le feriez normalement, comme LinearLayout ci-dessous.

Vous pouvez utiliser Android: alpha pour définir la transparence de l'image.

<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

  <ImageView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:scaleType="centerCrop"
    Android:src="@drawable/image"
    Android:alpha="0.6"/>

  <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    tools:context=".MainActivity">

      <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Hello"/>

      <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="There"/>

   </LinearLayout>
</RelativeLayout>
5
smurph

Ajoutez Android:background="@drawable/your_image" à l'intérieur de votre Relativelayout/Linearlayout Worked.

1
Mwongera808

Conformément à la réponse de NoToast, vous devez disposer de plusieurs versions de "your_image" dans vos res/drawable-ldpi, mdpi, hdpi, x-hdpi (pour les écrans très grands), remove match_parent et gardez Android: adjustViewBounds = "true"

1
sb_269

Si vous avez bg.png comme image d’arrière-plan, alors simplement:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@drawable/bg"
    tools:context=".MainActivity" >

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerHorizontal="true"
        Android:layout_centerVertical="true"
        Android:text="@string/hello_world"/>
</RelativeLayout>
0