wake-up-neo.com

ImageView füllt die Breite des übergeordneten Elements OR Höhe, behält aber das Seitenverhältnis bei

Ich habe ein quadratisches Bild (obwohl dieses Problem auch für rechteckige Bilder gilt). Ich möchte das Bild so groß wie möglich darstellen und es gegebenenfalls dehnen, um die Eltern zu füllen, während das Seitenverhältnis beibehalten wird. Das Bild ist kleiner als die Bildansicht. Das Problem ist, ich kann das Bild nicht strecken und die Höhe und Breite der Bildansicht "anpassen".

Dies ist meine XML-Layoutdatei:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:padding="10dp">

    <ImageView Android:id="@+id/image"
               Android:layout_width="fill_parent"
               Android:layout_height="fill_parent"
               Android:adjustViewBounds="true"
               Android:scaleType="fitCenter"
               Android:layout_marginTop="10dp"/>

    <TextView Android:id="@+id/name"
              Android:layout_below="@id/image"
              Android:layout_alignLeft="@id/image"
              Android:layout_marginTop="20dp"
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:textSize="18dp"/>

    <TextView Android:id="@+id/name2"
              Android:layout_below="@id/name"
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:textSize="14dp"/>


</RelativeLayout>

Ich habe viele Kombinationen von fill_parent, wrap_content mit mehreren scaleTypes verwendet: fitCenter, fitStart, fitEnd, centerInside, und alle zeichnen die Bilder im richtigen Seitenverhältnis, aber Keines der Bilder skaliert tatsächlich und das ImageView selbst Dies hat zur Folge, dass entweder die TextViews ganz nach unten vom Bildschirm geschoben werden, Leerzeichen in der ImageView, ein nicht skaliertes Bild oder ein abgeschnittenes Bild.

Ich kann nicht genau die richtige Kombination dafür finden.

38

Diese:

Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Android:adjustViewBounds="true"

sollte die Größe des Bildes ändern und die Größe der Begrenzungen an die neue Bildgröße anpassen. Wenn dies nicht auf Ihrem Gerät erfolgt, geben Sie das von Ihnen verwendete Image und das Gerät an, auf dem Sie testen.

97
FoamyGuy

Verwenden Sie diesen Code: Android:scaleType="fitXY"

Weitere Informationen zur Bildskalierung finden Sie in diesem Artikel hier

Zusammenfassung:

  • center

Zentrieren Sie das Bild in der Ansicht, führen Sie jedoch keine Skalierung durch

enter image description here

  • centerCrop

Skalieren Sie das Bild einheitlich (behalten Sie das Seitenverhältnis des Bildes bei), so dass beide Abmessungen (Breite und Höhe) des Bildes gleich oder größer als die entsprechende Abmessung der Ansicht sind (minus Auffüllen). Das Bild wird dann in der Ansicht zentriert

enter image description here

  • centerInside

Skalieren Sie das Bild gleichmäßig (behalten Sie das Seitenverhältnis des Bildes bei), so dass beide Abmessungen (Breite und Höhe) des Bildes gleich oder kleiner als die entsprechende Abmessung der Ansicht sind (minus Auffüllen).

enter image description here

  • fitCenter

enter image description here

  • fitEnd

enter image description here

  • fitStart

enter image description here

  • fitXY

enter image description here

  • matrix

Skalieren Sie beim Zeichnen mit der Bildmatrix

enter image description here

weitere Details hier neuer Artikel 

44
Context

Verwenden Sie diesen Code mit Ansichtslayout-Parametern als wrap_content

Android: adjustViewBounds = "true"

Hoffe das es klappt.

13
akashPatra

Dieser XML-Code wird funktionieren! Wenn Sie angeben, dass die Breite Ihrer Apps immer der des Fensters entspricht, legt Android:adjustViewBounds="true" die Höhe entsprechend dem Bildverhältnis fest.

        <ImageView
        Android:adjustViewBounds="true"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:src="@drawable/screen"/>
8
Febin Mathew

Ich hatte das gleiche Problem, Android: adjustViewBounds erledigt seine Arbeit nicht und hat eine Füllung oben im Bild. In einem relativen Layout mit übereinstimmenden Werten für die Breite und Höhe hatte ich:

   <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:orientation="vertical" Android:layout_width="match_parent"
   Android:layout_height="match_parent"
   Android:background="@color/transparent">

   <ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:scaleType="fitStart"
    Android:adjustViewBounds="true" ...

Ich habe das relative Layout in ein lineares Layout mit wrap_content-Werten für Breite und Höhe geändert. Jetzt ist es in Ordnung:

    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
4
Laurie Trichet

Haben Sie versucht, es programmgesteuert anzupassen? Ich denke, es funktioniert wirklich gut, wenn Sie die Höhe Ihres TextViews berechnen und die Höhe und Breite des Bildes auf dieser Basis anpassen.

private void adjustImageView()
{
    //Get the display dimensions
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    //TextView name
    TextView name = (TextView) findViewById(R.id.name);
    name.setText("your name text goes here");
    name.measure(0, 0);

    //name TextView height
    int nameH = name.getMeasuredHeight();

    //TextView name2
    TextView name2 = (TextView) findViewById(R.id.name2);
    name2.setText("your name2 text goes here");
    name2.measure(0, 0);

    //name2 TextView height
    int name2H = name2.getMeasuredHeight();

    //Original image
    Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image);

    //Width/Height ratio of your image
    float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight();

    //Calculate the new width and height of the image to display 
    int imageToShowHeight = metrics.heightPixels - nameH - name2H;
    int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight);

    //Adjust the image width and height if bigger than screen
    if(imageToShowWidth > metrics.widthPixels)
    {
        imageToShowWidth = metrics.widthPixels;
        imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
    }

    //Create the new image to be shown using the new dimensions 
    Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true);

    //Show the image in the ImageView
    ImageView image = (ImageView) findViewById(R.id.image);
    image.setImageBitmap(imageToShow);
}
3
slybloty

Legen Sie Android:layout_height="wrap_content" in der Bildansicht ..__ fest. Um ein Bild zu erstellen, dessen Breite der Bildschirmbreite entspricht und die Höhe entsprechend dem Seitenverhältnis eingestellt ist, gehen Sie wie folgt vor. Hier erwähne ich, wie man Image von URL zu Imageview lädt.

Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {

                        // creating the image that maintain aspect ratio with width of image is set to screenwidth.
                        int width = imageView.getMeasuredWidth();
                        int diw = resource.getWidth();
                        if (diw > 0) {
                            int height = 0;
                            height = width * resource.getHeight() / diw;
                            resource = Bitmap.createScaledBitmap(resource, width, height, false);
                        }
                                              imageView.setImageBitmap(resource);
                    }
                });

Hoffe das hilft.

0
Fathima km