74 votes

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

J'ai un peu de ImageViews à l'intérieur d'un LinearLayout. J'ai besoin de réduire l'échelle de l'ImageViews de manière à maintenir leurs ratios d'aspect tout en s'insérant à l'intérieur de la LinearLayout verticalement. Horizontalement, j'ai juste besoin d'eux pour être adjacents les uns aux autres.

J'ai fait une simplification de banc d'essai pour ce qui les nids pondérée des Mises en page afin que j'ai une grande, mais pas très haut, LinearLayout pour la 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'Eclipse de mise en page de l'éditeur les images sont coupées verticalement et non mis à l'échelle à tous - mais c'est juste un de ces particularités que nous apprenons à l'aimer)

Lors d'une exécution sur le matériel, les images sont redimensionnées à la bonne hauteur, tout en conservant leur aspect ratio. Mon problème, c'est qu'ils ne sont pas à côté les uns des autres. La hauteur de chaque ImageView correspond bien à la hauteur de la LinearLayout. La largeur de chaque ImageView est la largeur de la non mis à l'échelle de l'image, à l'échelle les images qui apparaissent sur le côté gauche de leur ImageViews. De ce fait, je suis un grand écart entre les images.

Idéalement, je voudrais gérer cela via un fichier XML, si ce n'est pas possible, je comprends que l'utilisation d'un affichage personnalisé peut être la meilleure solution.

J'ai essayé de créer un IconView (s'étend ImageView) qui remplace onMeasure pour que je puisse créer une image vue de la taille nécessaire par la mise à l'échelle de la largeur en fonction de la hauteur. Mais le parentWidth et parentHeight être transmis à la fonction sont les dimensions de l'écran et pas de la LinearLayout conteneur.

@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 certaine façon à lui faire faire ce dont j'ai besoin?

2) Comment puis-je faire de ma classe personnalisée obtenir la hauteur de la LinearLayout afin que je puisse calculer la largeur nécessaire pour les images personnalisées?

Merci si vous avez réussi à lire jusqu'ici. Encore plus merci si vous pouvez m'indiquer la direction de la une solution!

268voto

Matthew Willis Points 26453

Ce propos du changement de votre ImageViews utiliser android:layout_height="fill_parent"?

Edit - me fallut du temps pour trouver, mais en regardant la source m'a aidé à identifier les adjustViewBounds. Vous pourriez essayer d'ajouter de la android:adjustViewBounds="true" de votre ImageViews. Étonnamment, cette valeur par défaut est false.

12voto

user754657 Points 51

Étrangement android:layout_height="fill_parent" et android:adjustViewBounds="true" n'a pas aidé. Le problème que j'ai eu, c'est de l'image a été prise en affiche, mais avec bloc de lignes sur le dessus et noir en ligne sur le bas de l'image. L'échelle de réglage de type d' "centerCrop" m'a aidé. Je suppose, la raison d'être de mon image est de petite taille.

6voto

MichK Points 549

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

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