web-dev-qa-db-fra.com

La définition d'une image d'arrière-plan dans une vue étend la vue.

J'ai créé une image bitmap d'arrière-plan pour une vue et celle-ci est maintenant agrandie à la taille de l'image d'arrière-plan ....

est-ce normal?

<?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:src="@drawable/green"
        Android:tileMode="repeat"/>

voici comment je l'applique à mon avis

v.setBackgroundResource(R.drawable.backgroundgreen);

par exemple...

si l'image mesure 500 pixels de haut .__ et que la vue mesure 200 pixels de haut (étant définie avec wrap_content en hauteur)

31
Mars

Selon moi, le problème auquel vous êtes confrontés n'est pas un problème, c'est la façon dont Android est utilisé pour concevoir les mises en page.

Cela signifie que vous pouvez définir la hauteur et la largeur avec 3 valeurs constantes par défaut:

FILL_PARENT
Valeur spéciale pour la hauteur ou la largeur demandée par un View. FILL_PARENT signifie que la vue veut être aussi grande que son parent, moins le padding du parent, le cas échéant. Cette valeur est déconseillée à partir de l'API niveau 8 et remplacée par MATCH_PARENT.

MATCH_PARENT
Valeur spéciale pour la hauteur ou la largeur demandée par un View. MATCH_PARENT signifie que la vue veut être aussi grande que son parent, moins le padding du parent, le cas échéant. Introduit dans API niveau 8.

WRAP_CONTENT
Valeur spéciale pour la hauteur ou la largeur demandée par un View. WRAP_CONTENT signifie que la View veut être juste assez grande pour s’adapter à son propre contenu interne, en tenant compte de son propre remplissage.

Désormais, lorsque vous définissez la hauteur/largeur de View sur WRAP_CONTENT, vous autorisez la vue à prendre la taille suffisante pour afficher le contenu de la vue. L'image d'arrière-plan est également le contenu de la variable View. Par conséquent, votre vue sera affichée avec autant de taille que l'image. Ce n'est pas un problème, c'est comme ça que ça se voit.

D'accord, mais dans votre situation, c'est un problème pour vous car vous avez un fond à montrer et la vue ne devrait pas être étirée pour cela. Je peux suggérer quelques moyens:

  1. Tout d’abord, c’est évident: créez des images correctement dimensionnées et conservez-les dans des dossiers différents pouvant être dessinés .

  2. Spécifiez la taille de la vue sans utiliser les constantes , mais dans DP . Si cela s'avère nécessaire, créez des fichiers XML de mise en page différents pour des tailles différentes et conservez-les dans dossiers de mise en forme .

  3. Vous pouvez utiliser une chose très utile pour la mise en page de conception est poids de la mise en page .

28
MKJParekh

J'ai rencontré le même problème.

Si la taille de l'image d'arrière-plan est supérieure à celle de la vue, celle-ci changera pour correspondre à la taille de l'image.

Solution


  1. Placez la vue dans une mise en page relative.
  2. Supprimer l'image de fond.
  3. Ajouter un ImageView avant la vue à l'intérieur de la disposition relative
  4. Définissez la src de ImageView sur votre image d'arrière-plan

    <RelativeLayout
        .
        .
        . >
    
        <ImageView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignLeft="@+id/yourViewId"
            Android:layout_alignRight="@+id/yourViewId"
            Android:layout_alignTop="@+id/yourViewId"
            Android:layout_alignBottom="@+id/yourViewId"
            Android:adjustViewBounds="true" 
            //this will allow the image to resize with same proportions
            Android:src="@drawable/yourDrawable" />
    
        <YourView
            Android:id="@+id/yourViewId"
            .
            ..
            ... />
    
      </RelativeLayout>
    

Tout cela peut être fait dans le code bien sûr.

35
Sherif elKhatib

Je suggère de créer une mise en page et de placer l’image d’arrière-plan. Je l'utilise de cette façon et me va très bien ... Voir l'exemple ci-dessous

<ScrollView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/settingstab_scroll"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:scrollbars="vertical"
    Android:background="@drawable/wareninja_wallpaper_img"
    >
<!-- your layouts and components goes here -->
</ScrollView>


...
Codage social @ AspiroTV

3
guleryuz

Cela fonctionne pour moi.

< ?xml version="1.0" encoding="utf-8"?>
 < LinearLayout

xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" Android:id="@+id/LinearLayoutTest">    

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prueba);


    ((LinearLayout)findViewById(R.id.LinearLayoutTest)).setBackgroundResource(R.drawable.greenrepeat);
}

dans votre code, qu'est-ce que v? Il a params à fill_parent?

1
AntPachon

Une bonne solution qui fonctionne parfaitement dans mon cas est d’étendre la View et de remplacer le onMeasure().

Voici les étapes à suivre:

  1. Créez une propre classe et étendez la View que vous voulez utiliser, ici pour Exemple, je vais utiliser Button.
  2. Remplacez la méthode onMeasure() et insérez le code en bas. Cela définira la ressource d'arrière-plan après la première mesure. Pour le deuxième événement de mesure, il utilisera les paramètres déjà mesurés.

Exemple de code pour une vue personnalisée qui étend Button (remplacez Button par la vue que vous souhaitez étendre)

public class MyButton extends Button {

    boolean backGroundSet = false;

    public MyButton(Context context) {
        super(context);
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);          
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if(backGroundSet) {
            setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());
            return;
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        backGroundSet = true;
        setBackgroundResource(R.drawable.button_back_selector);

    }
}

La seule chose à modifier ici est le type de vue que vous souhaitez étendre et dans la méthode onMeasure() la ressource en arrière-plan que vous souhaitez utiliser pour la vue.

Après cela, utilisez simplement cette vue dans votre mise en page XML ou ajoutez-la par programme.

0
Chris623

N'utilisez pas Android:tileMode="repeat". Votre green drawable est-il plus grand ou plus petit que votre vue? Pourrait ajouter plus de détails?

0
slybloty