web-dev-qa-db-fra.com

Fond de culture Android

J'ai une LinearLayout avec une largeur définie sur fill_parent et une hauteur sur wrap_content. Maintenant, je veux lui donner un arrière-plan à partir d'un fichier png, mais le faire de manière traditionnelle provoque le redimensionnement de LinearLayout afin d'afficher tout l'arrière-plan au lieu de rogner la partie supplémentaire.

Comment définir l'arrière-plan de LinearLayout pour qu'il ne soit pas redimensionné?

Merci

28
Sebastian Nowak

Il semble qu’une telle chose ne soit réalisable qu’en utilisant ImageView et en définissant le paramètre scaleType en conséquence. Une solution rapide consiste à utiliser FrameLayout et à placer ImageView sous une autre disposition avec un arrière-plan transparent.

Code:

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

    <ImageView
        Android:id="@+id/imageView1"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:scaleType="centerCrop"
        Android:src="@drawable/background" />

</FrameLayout>
30
Sebastian Nowak

Le comportement par défaut des bitmaps d'arrière-plan consiste à remplir complètement le conteneur et à augmenter la taille horizontale et verticale du conteneur si nécessaire. La solution consiste à créer une ressource bitmap pouvant être dessinée et à modifier la gravité. 

Vérifiez le lien suivant et recherchez les valeurs de gravité possibles. Votre vue devrait alors simplement faire référence à la ressource pouvant être dessinée et tout devrait bien se passer.

http://developer.Android.com/guide/topics/resources/drawable-resource.html#Bitmap

7
Ernir Erlingsson

J'ai résolu celui-ci en sous-classant LinearLayout et en surchargeant le rappel onMeasure(int,int), puis en mettant à jour le XML de présentation pour qu'il utilise mon nouveau type de présentation. Je ne suis pas libre d’afficher ce code exact, mais j’ai invoqué l’implémentation super.onMeasure(int,int) et vérifié si la hauteur mesurée est revenue à la hauteur exacte de mon image de fond. Si tel est le cas, je saisis la hauteur mesurée de toutes les vues enfant, puis calcule une nouvelle valeur de hauteur et la passe à setMeasuredDimension(int,int).

1
Barend