211 votes

ImageView - avoir la hauteur correspondre à la largeur?

J'ai une imageview. Je veux sa largeur à fill_parent. Je veux sa hauteur quelle que soit la largeur. Par exemple:

<ImageView
  android:layout_width="fill_parent"
  android:layout_height="whatever the width ends up being" />

C'est quelque chose comme que possible dans un fichier de mise en page sans avoir à créer mon propre point de vue de la classe?

Merci

115voto

Vlad Stefanescu Points 223

Peut-être que cela va répondre à votre question:

<ImageView
    android:id="@+id/cover_image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true" />

Vous pouvez ignorer l' scaleType d'attribut pour cette situation particulière.

31voto

drees Points 1451

Cela peut être fait en utilisant LayoutParams pour définir dynamiquement les points de Vue de la hauteur une fois votre savoir le point de Vue de la largeur lors de l'exécution. Vous devez utiliser un Exécutable fil afin d'obtenir le point de Vue de la largeur au moment de l'exécution, sinon vous allez être en train d'essayer de régler la Hauteur avant de connaître le point de Vue de la largeur, car la mise en page n'a pas été encore dessinés.

Exemple de comment j'ai résolu mon problème:

final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_id);

    mFrame.post(new Runnable() {

        @Override
        public void run() {
            RelativeLayout.LayoutParams mParams;
            mParams = (RelativeLayout.LayoutParams) mFrame.getLayoutParams();
            mParams.height = mFrame.getWidth();
            mFrame.setLayoutParams(mParams);
            mFrame.postInvalidate();
        }
    });

Le LayoutParams doit être du type de la Vue Parent que votre vue est en. Mon FrameLayout est à l'intérieur d'un RelativeLayout dans le fichier xml.

    mFrame.postInvalidate();

est appelé pour forcer l'affichage de redessiner alors que sur un autre thread que le thread d'INTERFACE utilisateur

13voto

Regis_AG Points 2359

Ici, j'ai ce que j'ai fait pour avoir un ImageButton qui ont toujours une largeur égale à sa hauteur et éviter stupide marges vides dans un sens...que je considère comme un bug dans le SDK...):

J'ai défini une SquareImageButton classe qui s'étend de ImageButton:

package com.myproject;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageButton;

    public class SquareImageButton extends ImageButton {

        public SquareImageButton(Context context) {
        super(context);


        // TODO Auto-generated constructor stub
    }

    public SquareImageButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub

    }

    public SquareImageButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub

    }

    int squareDim = 1000000000;

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);


        int h = this.getMeasuredHeight();
        int w = this.getMeasuredWidth();
        int curSquareDim = Math.min(w,h);

        if(curSquareDim < squareDim)
        {
            squareDim = curSquareDim;
        }

        Log.d("MyApp", "h "+h+"w "+w+"squareDim "+squareDim);


        setMeasuredDimension(squareDim, squareDim);

    }

}

Voici mon fichier xml:

<com.myproject.SquareImageButton
            android:id="@+id/speakButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:scaleType="centerInside"
            android:src="@drawable/icon_rounded_no_shadow_144px"
            android:background="#00ff00"
            android:layout_alignTop="@+id/searchEditText"
            android:layout_alignBottom="@+id/searchEditText"
            android:layout_alignParentLeft="true"
           />

Fonctionne comme un charme !

6voto

smith324 Points 6423

Vous ne pouvez pas le faire avec la mise en page tout seul, j'ai essayé. J'ai fini par écrire une classe très simple à manipuler, vous pouvez le vérifier sur github. SquareImage.java Sa partie d'un projet plus vaste, mais rien qu'un peu de copier et coller ne peut pas corriger (sous licence Apache 2.0)

Essentiellement, vous avez juste besoin de régler la hauteur/largeur est égale à une autre dimension (en fonction de la façon dont vous souhaitez mettre à l'échelle)

Remarque: Vous pouvez la rendre carrée sans une classe personnalisée à l'aide de l' scaleType d'attribut, mais la vue de s'étendre au-delà des limites de l'image visible, ce qui en fait un problème si vous êtes de placer d'autres points de vue près d'elle.

5voto

Matt Logan Points 2116

Pour définir votre ImageView égale à la moitié de l'écran, vous devez ajouter les lignes suivantes à votre XML pour l'ImageView:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:scaleType="fitXY"
    android:adjustViewBounds="true"/>

Définir ensuite la hauteur égale à cette largeur, vous devez le faire dans le code. Dans l' getView méthode de GridView de l'adaptateur, fixer l' ImageView hauteur égale à sa largeur mesurée:

mImageView.getLayoutParams().height = mImageView.getMeasuredWidth();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X