Passen Sie Bild in ImageView, halten Sie das Seitenverhältnis und verkleinern Sie dann ImageView auf Bilddimensionen?

Wie passt man ein Bild von zufälliger Größe zu einem ImageView ?
Wann:

  • Anfänglich sind ImageView Dimensionen 250dp * 250dp
  • Die größere Dimension des Bildes sollte auf 250dp skaliert werden
  • Das Bild sollte sein Seitenverhältnis beibehalten
  • Die ImageView Dimensionen sollten nach der Skalierung mit den Bemaßungen des skalierten Bildes übereinstimmen

ZB für ein Bild von 100 * 150, sollte das Bild und die ImageView 166 * 250 sein.
ZB für ein Bild von 150 * 100, das Bild und die ImageView sollte 250 * 166 sein.

  • Android title wird nicht in der Symbolleiste angezeigt
  • Wie bekomme ich Zellen-Service-Signalstärke in Android?
  • Wie kann ich eine Aktivität aus einer ListView-Adapterklasse beenden?
  • Android wählen Sie Bild aus der Galerie mit Speicherfehler
  • ExpandableListView mit einem EditText
  • Prozentsatzbreite in einem RelativeLayout
  • Wenn ich die Grenzen stelle

     <ImageView android:id="@+id/picture" android:layout_width="250dp" android:layout_height="250dp" android:layout_gravity="center_horizontal" android:layout_marginTop="20dp" android:adjustViewBounds="true" /> 

    Bilder passen richtig in die ImageView , aber die ImageView ist immer 250dp * 250dp.

  • Manchmal komme ich nicht auf CreateLoader Rückruf nach dem Aufruf von initLoader
  • RelativeLayout nicht richtig aktualisieren Breite der benutzerdefinierten Ansicht
  • Dexopt scheiterte an einer sehr großen APK (Out-of-order method_idx), wenn dex.force.jumbo = true
  • So fügen Sie das Action-Bar-Optionen-Menü in Android-Fragmente hinzu
  • Android-Set-Navigations-Schublade Liste, um genaue Hälfte des Bildschirms für alle Geräte-Bildschirm zu öffnen
  • Warum ein Rundfunkempfänger nur über Code oder AndroidManifest registriert werden kann
  • 11 Solutions collect form web for “Passen Sie Bild in ImageView, halten Sie das Seitenverhältnis und verkleinern Sie dann ImageView auf Bilddimensionen?”

    (Die Antwort wurde nach der Klärung der ursprünglichen Frage stark geändert)

    Nach klärungen:
    Dies kann nicht nur in xml erfolgen . Es ist nicht möglich, sowohl das Bild als auch das ImageView so dass die eine Dimension des Bildes immer ImageView wäre und die ImageView die gleichen Dimensionen wie das Bild haben würde.

    Diese Code-Skalen Drawable einer ImageView zu bleiben in einem Quadrat wie 250dp x 250dp mit einer Dimension genau 250dp und halten das Seitenverhältnis. Dann wird die ImageView skaliert, dass sie den Dimensionen des skalierten Bildes entspricht. Der Code wird in einer Aktivität verwendet. Ich habe es per Knopfleiste getestet.

    Genießen. 🙂

     private void scaleImage(ImageView view) throws NoSuchElementException { // Get bitmap from the the ImageView. Bitmap bitmap = null; try { Drawable drawing = view.getDrawable(); bitmap = ((BitmapDrawable) drawing).getBitmap(); } catch (NullPointerException e) { throw new NoSuchElementException("No drawable on given view"); } catch (ClassCastException e) { // Check bitmap is Ion drawable bitmap = Ion.with(view).getBitmap(); } // Get current dimensions AND the desired bounding box int width = 0; try { width = bitmap.getWidth(); } catch (NullPointerException e) { throw new NoSuchElementException("Can't find bitmap on given view/drawable"); } int height = bitmap.getHeight(); int bounding = dpToPx(250); Log.i("Test", "original width = " + Integer.toString(width)); Log.i("Test", "original height = " + Integer.toString(height)); Log.i("Test", "bounding = " + Integer.toString(bounding)); // Determine how much to scale: the dimension requiring less scaling is // closer to the its side. This way the image always stays inside your // bounding box AND either x/y axis touches it. float xScale = ((float) bounding) / width; float yScale = ((float) bounding) / height; float scale = (xScale <= yScale) ? xScale : yScale; Log.i("Test", "xScale = " + Float.toString(xScale)); Log.i("Test", "yScale = " + Float.toString(yScale)); Log.i("Test", "scale = " + Float.toString(scale)); // Create a matrix for the scaling and add the scaling data Matrix matrix = new Matrix(); matrix.postScale(scale, scale); // Create a new bitmap and convert it to a format understood by the ImageView Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); width = scaledBitmap.getWidth(); // re-use height = scaledBitmap.getHeight(); // re-use BitmapDrawable result = new BitmapDrawable(scaledBitmap); Log.i("Test", "scaled width = " + Integer.toString(width)); Log.i("Test", "scaled height = " + Integer.toString(height)); // Apply the scaled bitmap view.setImageDrawable(result); // Now change ImageView's dimensions to match the scaled image LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); params.width = width; params.height = height; view.setLayoutParams(params); Log.i("Test", "done"); } private int dpToPx(int dp) { float density = getApplicationContext().getResources().getDisplayMetrics().density; return Math.round((float)dp * density); } 

    Der XML-Code für die ImageView :

     <ImageView a:id="@+id/image_box" a:background="#ff0000" a:src="@drawable/star" a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_marginTop="20dp" a:layout_gravity="center_horizontal"/> 

    Dank dieser Diskussion für den Skalierungscode:
    http://www.anddev.org/resize_and_rotate_image_-_example-t621.html

    UPDATE 7th, November 2012:
    Hinzugefügt Null Zeigerprüfung wie in Kommentare vorgeschlagen

    Kannst du nicht auf diese spezielle Frage antworten, aber wenn jemand ist, wie ich, suche nach Antwort, wie man Bild in ImageView mit beschränkter Größe (z. B. maxWidth ) maxWidth während maxWidth Seitenverhältnis maxWidth und dann von überhöhtem Raum, das von ImageView besetzt ist, Dann ist die einfachste Lösung, die folgenden Eigenschaften in XML zu verwenden:

      android:scaleType="centerInside" android:adjustViewBounds="true" 
     <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:adjustViewBounds="true"/> 

    Der untere Code macht die Bitmap perfekt mit der gleichen Größe der Bildansicht. Holen Sie sich die Bitmap-Bildhöhe und -breite und berechnen Sie dann die neue Höhe und Breite mit Hilfe der Parameter von imageview. Das gibt dir das gewünschte Bild mit dem besten Seitenverhältnis.

     int currentBitmapWidth = bitMap.getWidth(); int currentBitmapHeight = bitMap.getHeight(); int ivWidth = imageView.getWidth(); int ivHeight = imageView.getHeight(); int newWidth = ivWidth; newHeight = (int) Math.floor((double) currentBitmapHeight *( (double) new_width / (double) currentBitmapWidth)); Bitmap newbitMap = Bitmap.createScaledBitmap(bitMap, newWidth, newHeight, true); imageView.setImageBitmap(newbitMap) 

    genießen.

    Versuchen Sie Hinzufügen von android:scaleType="fitXY" zu Ihrem ImageView .

    Nach der Suche nach einem Tag, denke ich, das ist die einfachste Lösung:

     imageView.getLayoutParams().width = 250; imageView.getLayoutParams().height = 250; imageView.setAdjustViewBounds(true); 

    Bearbeitet Jarno Argillanders Antwort:

    So passen Sie das Bild mit Ihrer Breite und Höhe an:

    1) Initialisieren von ImageView und Set Image:

     iv = (ImageView) findViewById(R.id.iv_image); iv.setImageBitmap(image); 

    2) Jetzt Größe ändern:

     scaleImage(iv); 

    Bearbeitete scaleImage Methode: ( Sie können erwartete Grenzwerte ersetzen )

     private void scaleImage(ImageView view) { Drawable drawing = view.getDrawable(); if (drawing == null) { return; } Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); int xBounding = ((View) view.getParent()).getWidth();//EXPECTED WIDTH int yBounding = ((View) view.getParent()).getHeight();//EXPECTED HEIGHT float xScale = ((float) xBounding) / width; float yScale = ((float) yBounding) / height; Matrix matrix = new Matrix(); matrix.postScale(xScale, yScale); Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); width = scaledBitmap.getWidth(); height = scaledBitmap.getHeight(); BitmapDrawable result = new BitmapDrawable(context.getResources(), scaledBitmap); view.setImageDrawable(result); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); params.width = width; params.height = height; view.setLayoutParams(params); } 

    Und .xml:

     <ImageView android:id="@+id/iv_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /> 

    Verwenden Sie diesen Code:

     <ImageView android:id="@+id/avatar" android:layout_width="fill_parent" android:layout_height="match_parent" android:scaleType="fitXY" /> 

    Das kann man alles mit XML machen … die anderen Methoden scheinen ziemlich kompliziert zu sein. Wie auch immer, du hast einfach die Höhe, was auch immer du in dp willst, dann setze die Breite ein, um den Inhalt zu wickeln oder umgekehrt. Verwenden Sie scaleType fitCenter, um die Größe des Bildes anzupassen.

     <ImageView android:layout_height="200dp" android:layout_width="wrap_content" android:scaleType="fitCenter" android:adjustViewBounds="true" android:src="@mipmap/ic_launcher" android:layout_below="@+id/title" android:layout_margin="5dip" android:id="@+id/imageView1"> 

    Das tat es für meinen Fall.

      <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:scaleType="centerCrop" android:adjustViewBounds="true" /> 

    Ich musste dies in einem Constraint-Layout mit Picasso machen, also habe ich einige der oben genannten Antworten zusammengefasst und kam mit dieser Lösung auf (ich kenne schon das Seitenverhältnis des Bildes, das ich lade, also das hilft):

    Aufgerufen in meinem Aktivitätscode irgendwo nach setContentView (…)

     protected void setBoxshotBackgroundImage() { ImageView backgroundImageView = (ImageView) findViewById(R.id.background_image_view); if(backgroundImageView != null) { DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int width = displayMetrics.widthPixels; int height = (int) Math.round(width * ImageLoader.BOXART_HEIGHT_ASPECT_RATIO); // we adjust the height of this element, as the width is already pinned to the parent in xml backgroundImageView.getLayoutParams().height = height; // implement your Picasso loading code here } else { // fallback if no element in layout... } } 

    In meinem XML

     <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout_editor_absoluteY="0dp" tools:layout_editor_absoluteX="0dp"> <ImageView android:id="@+id/background_image_view" android:layout_width="0dp" android:layout_height="0dp" android:scaleType="fitStart" app:srcCompat="@color/background" android:adjustViewBounds="true" tools:layout_editor_absoluteY="0dp" android:layout_marginTop="0dp" android:layout_marginBottom="0dp" android:layout_marginRight="0dp" android:layout_marginLeft="0dp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"/> <!-- other elements of this layout here... --> </android.support.constraint.ConstraintLayout> 

    Beachten Sie das Fehlen eines ConstraintBottom_toBottomOf-Attributs. ImageLoader ist meine eigene statische Klasse für Bildbelastung Methoden und Konstanten.

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.