web-dev-qa-db-fra.com

Android La taille de ImageView n'est pas mise à l'échelle avec l'image source

J'ai quelques images dans un LinearLayout. J'ai besoin de réduire ImageViews pour qu'ils conservent leurs proportions tout en s'adaptant verticalement à l'intérieur de LinearLayout. Horizontalement, j'ai juste besoin qu'ils soient adjacents les uns aux autres.

J'ai fait un banc d'essai simplifié pour cette image qui imbrique des dispositions pondérées de sorte que j'ai un LinearLayout large, mais pas très grand, pour ImageViews -

<?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">
    <LinearLayout Android:id="@+id/linearLayout1" Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:layout_weight="5">
        <LinearLayout Android:id="@+id/linearLayout3" Android:layout_height="fill_parent" Android:layout_width="fill_parent" Android:layout_weight="1">
            <ImageView Android:id="@+id/imageView1" Android:layout_height="wrap_content" Android:layout_width="wrap_content" Android:src="@drawable/test_image" Android:scaleType="fitStart"></ImageView>
            <ImageView Android:id="@+id/imageView2" Android:layout_height="wrap_content" Android:layout_width="wrap_content" Android:src="@drawable/test_image" Android:scaleType="fitStart"></ImageView>
        </LinearLayout>
        <LinearLayout Android:id="@+id/linearLayout4" Android:layout_height="fill_parent" Android:layout_width="fill_parent" Android:layout_weight="1"></LinearLayout>
    </LinearLayout>
    <LinearLayout Android:id="@+id/linearLayout2" Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:layout_weight="1"></LinearLayout>
</LinearLayout>

(Dans l'éditeur de mise en page Eclipse, les images sont découpées verticalement et pas du tout redimensionnées - mais ce n'est qu'une de ces idiosyncrasies que nous apprenons à aimer)

Lorsqu'elles sont exécutées sur du matériel, les images sont redimensionnées à la bonne hauteur tout en préservant leur format. Mon problème est qu'ils ne sont pas côte à côte. La hauteur de chaque ImageView correspond correctement à la hauteur de LinearLayout. La largeur de chaque image est la largeur de l'image non mise à l'échelle, c'est-à-dire que les images réduites apparaissent à gauche de leur image. À cause de cela, il y a un grand écart entre les images.

Idéalement, j'aimerais gérer cela via XML, mais si cela n'est pas possible, je comprends que l'utilisation d'une vue personnalisée peut être la meilleure solution.

J'ai essayé de créer une classe IconView (extend ImageView) qui redéfinit onMeasure afin de pouvoir créer des vues d'image de la taille nécessaire en mettant à l'échelle la largeur en fonction de la hauteur. Mais les valeurs parentWidth et parentHeight transmises à la fonction étaient les dimensions de l'écran et non du conteneur LinearLayout.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
  int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
  // Calculations followed by calls to setMeasuredDimension, setLayoutParams
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Donc mes questions sont -

1) Puis-je modifier le XML d’une manière ou d’une autre pour lui faire faire ce dont j'ai besoin?

2) Comment faire en sorte que ma classe personnalisée obtienne la hauteur de LinearLayout afin de pouvoir calculer la largeur nécessaire pour les images personnalisées?

Merci si vous avez réussi à lire jusqu'à présent. Encore plus merci si vous pouvez me diriger vers une solution!

72
Rok

Pourquoi ne pas changer vos ImageViews pour utiliser Android:layout_height="fill_parent"?

Edit - Il m'a fallu un certain temps pour trouver, mais regarder la source m'a aidé à localiser adjustViewBounds . Vous voudrez peut-être essayer d'ajouter Android:adjustViewBounds="true" à vos ImageViews. Étonnamment, cette valeur par défaut est false.

261
Matthew Willis

Etrangement Android:layout_height="fill_parent" et Android:adjustViewBounds="true" n'a pas aidé. Le problème que j'ai eu est que l'image était affichée, mais avec une ligne de bloc en haut et une ligne noire en bas de l'image. Définition du type d'échelle sur "centerCrop" m'a aidé. Je suppose que la raison étant que la taille de mon image était petite.

11
user754657

J'ai eu le même problème et ma solution a été de régler Android:scaleType="fitEnd" attribut de ImageView dans le fichier de mise en page XML.

6
MichK