it-swarm.com.de

So skalieren Sie ein Bild in ImageView, um das Seitenverhältnis beizubehalten

In Android habe ich einen ImageView_layout_width als fill_parent definiert (der die gesamte Breite des Telefons einnimmt).

Wenn das Bild, das ich in ImageView eingebe, größer ist als das layout_width, wird es von Android skaliert, oder? Aber wie sieht es mit der Höhe aus? Wird Android das Bild skalieren, bleibt das Seitenverhältnis erhalten?

Ich finde heraus, dass es oben und unten in ImageView etwas Leerzeichen gibt, wenn Android ein Bild skaliert, das größer ist als das ImageView. Ist das wahr? Wenn ja, wie kann ich diesen Leerraum beseitigen?

461
michael
  1. Ja, standardmäßig skaliert Android Ihr Bild auf ImageView, wobei das Seitenverhältnis beibehalten wird. Stellen Sie jedoch sicher, dass Sie das Bild mit Android:src="..." anstelle von Android:background="..." auf ImageView einstellen. Mit src= wird das Bild unter Beibehaltung des Seitenverhältnisses skaliert. Mit background= wird das Bild jedoch skaliert und verzerrt, damit es genau der Größe von ImageView entspricht. (Sie können jedoch gleichzeitig einen Hintergrund und eine Quelle verwenden, was beispielsweise für das Anzeigen eines Rahmens um das Hauptbild mit nur einer ImageView nützlich sein kann.)

  2. Sie sollten auch Android:adjustViewBounds sehen, damit ImageView die Größe des neu skalierten Bildes ändert. Wenn Sie beispielsweise ein rechteckiges Bild in einer normalerweise quadratischen ImageView-Ansicht haben, wird es mit adjustViewBounds = true festgelegt, dass auch die ImageView-Komponente rechteckig wird. Dies beeinflusst dann, wie andere Ansichten um die ImageView herum angeordnet werden.

    Dann können Sie, wie Samuh schrieb, die Art und Weise ändern, wie Bilder standardmäßig mit dem Parameter Android:scaleType skaliert werden. Übrigens, der einfachste Weg, um herauszufinden, wie das funktioniert, wäre einfach gewesen, ein wenig selbst zu experimentieren! Denken Sie daran, sich die Layouts im Emulator selbst (oder einem tatsächlichen Telefon) anzusehen, da die Vorschau in Eclipse normalerweise falsch ist.

724
Steve Haley

Siehe Android:adjustViewBounds .

Setzen Sie diese Option auf "true", wenn ImageView seine Grenzen anpassen soll, um das Seitenverhältnis der Zeichenfläche beizubehalten.

260
Gratzi

An alle anderen, die dieses spezielle Problem haben. Sie haben eine ImageView (oder eine andere View), für die Sie eine Breite von fill_parent und eine proportional proportionierte Höhe haben möchten:

Fügen Sie diese beiden Attribute Ihrer ImageView hinzu:

Android:adjustViewBounds="true"
Android:scaleType="centerCrop"

Legen Sie die ImageView width auf fill_parent und die Höhe auf wrap_content fest.

Wenn Sie nicht möchten, dass Ihr Bild abgeschnitten wird, versuchen Sie Folgendes:

 Android:adjustViewBounds="true"
 Android:layout_centerInParent="true"
155
Kevin Parker

Wenn Sie eine ImageView wünschen, die unter Beibehaltung des korrekten Seitenverhältnisses nach oben und unten skaliert, fügen Sie dies Ihrem XML hinzu:

Android:adjustViewBounds="true"
Android:scaleType="fitCenter"

Fügen Sie dies Ihrem Code hinzu:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

Es hat eine Weile gedauert, bis dies funktioniert hat, aber dies scheint in den Fällen zu funktionieren, in denen das Bild kleiner als die Bildschirmbreite und größer als die Bildschirmbreite ist und das Bild nicht eingebettet wird.

50
Kevin

Das hat für mich funktioniert:

Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:maxWidth="39dip"
Android:scaleType="centerCrop"
Android:adjustViewBounds ="true"
11
Mike6679

Code unten für Skalierungsbild als Seitenverhältnis:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);
8
Mukesh Parmar

das hat mein Problem gelöst

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
7

Werfen Sie einen Blick auf ImageView.ScaleType , um die Art und Weise der Größenänderung in einer ImageView zu kontrollieren und zu verstehen. Wenn das Bild in der Größe geändert wird (wobei das Seitenverhältnis beibehalten wird), besteht die Möglichkeit, dass entweder die Höhe oder Breite des Bildes kleiner als die Abmessungen von ImageView wird. 

7
Samuh

Verwenden Sie diese Eigenschaften in ImageView, um das Seitenverhältnis beizubehalten:

Android:adjustViewBounds="true"
Android:scaleType="fitXY"

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:adjustViewBounds="true"
    Android:scaleType="fitXY"
    />
5
Atif Mahmood

Ich habe ein Bild, das kleiner als der Bildschirm ist. Damit es proportional zum Maximum gestreckt und in der Ansicht zentriert wurde, musste ich den folgenden Code verwenden:

<ImageView
    Android:id="@+id/my_image"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_centerInParent="true"
    Android:adjustViewBounds="true"
    Android:layout_weight="1"
    Android:scaleType="fitCenter" />

Denken Sie jedoch daran, dass, wenn Sie über ein relatives Layout verfügen und einige Elemente oberhalb oder unterhalb der ImageView festgelegt sind, diese höchstwahrscheinlich von dem Bild überlappt werden.

4
halxinate

Für jeden von Ihnen, der das Bild mit der richtigen Skalierung und ohne Zuschnitt exakt auf die Bildansicht abstimmen möchte

imageView.setScaleType(ScaleType.FIT_XY);

dabei ist imageView die Ansicht, die Ihr ImageView darstellt

3

Sie können die Bildschirmbreite berechnen. Und Sie können Bitmap skalieren.

 public static float getScreenWidth(Activity activity) {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        float pxWidth = outMetrics.widthPixels;
        return pxWidth;
    }

berechnet die Bildschirmbreite und die skalierte Bildhöhe anhand der Bildschirmbreite.

float screenWidth=getScreenWidth(act)
  float newHeight = screenWidth;
  if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
     newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
  }

Nachdem Sie Bitmap skalieren können.

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);
3
mustafasevgi

Wenn Sie dies programmgesteuert ausführen, rufen Sie die Setter in der richtigen Reihenfolge auf:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
3
lukas

Wenn Sie möchten, dass Ihr Bild den maximal möglichen Platz einnimmt, ist dies die beste Option

Android:layout_weight="1"
Android:scaleType="fitCenter"
2
Mohsen Afshin

Ich habe einen Algorithmus zum Skalieren einer Bitmap, um die Abmessungen des Containers optimal anzupassen und das Seitenverhältnis beizubehalten. Hier finden Sie meine Lösung hier

Hoffe, das hilft jemandem die Spur runter!

1
Parth Kapoor

Versuchen Sie es mit Android:layout_gravity für ImageView:

Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:layout_gravity="center_vertical|center_horizontal"
Android:layout_weight="1"

Das obige Beispiel hat für mich funktioniert.

1
ITisha

Sie benötigen keinen Java-Code. Du musst nur :

<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="centerCrop" />

Der Schlüssel steht in der Übereinstimmung für Breite und Höhe

1
Romu Dizzy

Sie können das Bild skalieren, um auch die Größe Ihres Bildes zu reduzieren. Es gibt eine Bibliothek, die Sie herunterladen und verwenden können https://github.com/niraj124124/Images-Files-scale -and-compress.git

Verwendung von 1) Importieren Sie den Kompressor-v1.0. jar zu Ihrem Projekt . 2) Fügen Sie den folgenden Beispielcode zu test ..__ hinzu. ResizeLimiter resize = ImageResizer.build (); resize.scale ("inputImagePath", "outputImagePath", imageWidth, imageHeight); Viele weitere Methoden stehen entsprechend Ihrer Anforderung zur Verfügung

0
Niraj

Ich benutze das: 

<ImageView
Android:id="@+id/logo"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_centerInParent="true"
Android:scaleType="centerInside"
Android:src="@drawable/logo" />
0
Flavio Capaccio

Wenn die Bildqualität abnimmt in: Use

Android:adjustViewBounds="true"

anstatt 

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
0
Sumit Singh

Übergeben Sie Ihr ImageView und je nach Bildschirmhöhe und -breite können Sie es erstellen 

    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }

0
user2100931

im Falle der Verwendung von cardviewfür das Verrunden von imageview und dem festen Android:layout_height für den Header funktionierte dies beim Laden des Images mit Glide

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
             xmlns:tools="http://schemas.Android.com/tools"
             Android:layout_width="match_parent"
             Android:layout_height="220dp"
             xmlns:card_view="http://schemas.Android.com/apk/res-auto"
             >

    <Android.support.v7.widget.CardView
            Android:id="@+id/card_view"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center|top"
            card_view:cardBackgroundColor="@color/colorPrimary"
            card_view:cardCornerRadius="10dp"
            card_view:cardElevation="10dp"
            card_view:cardPreventCornerOverlap="false"
            card_view:cardUseCompatPadding="true">

        <ImageView
                Android:adjustViewBounds="true"
                Android:maxHeight="220dp"
                Android:id="@+id/iv_full"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:scaleType="fitCenter"/>

    </Android.support.v7.widget.CardView>
</FrameLayout>
0
lvl4fi4

So hat es bei mir in einem ConstraintLayout funktioniert:

<ImageView
    Android:id="@+id/myImg"
    Android:layout_width="300dp"
    Android:layout_height="300dp"
    Android:scaleType="fitCenter"
    Android:adjustViewBounds="true"/>

Dann setze ich im Code das Drawable wie folgt:

ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));

Dies passt das Bild gut an sein Seitenverhältnis an und hält es in der Mitte.

0
Jeet