Come ridimensionare un'immagine in ImageView per mantenere le proporzioni


526

In Android, ho definito un ImageView' layout_widthessere fill_parent(che occupa l'intera larghezza del telefono).

Se l'immagine che metto su ImageViewè più grande di layout_width, Android la ridimensionerà, giusto? Ma per quanto riguarda l'altezza? Quando Android ridimensiona l'immagine, manterrà le proporzioni?

Quello che ho scoperto è che c'è uno spazio bianco nella parte superiore e inferiore di ImageViewquando Android ridimensiona un'immagine che è più grande di ImageView. È vero? Se sì, come posso eliminare quello spazio bianco?

Risposte:


799
  1. Sì, per impostazione predefinita Android ridimensionerà l'immagine per adattarla a ImageView, mantenendo le proporzioni. Tuttavia, assicurati di impostare l'immagine su ImageView utilizzando android:src="..."anziché android:background="...". src=consente di ridimensionare l'immagine mantenendo le proporzioni, ma background=consente di ridimensionare e distorcere l'immagine per adattarla esattamente alle dimensioni di ImageView. (Puoi usare uno sfondo e una fonte allo stesso tempo, il che può essere utile per cose come la visualizzazione di una cornice attorno all'immagine principale, usando solo un ImageView.)

  2. Dovresti anche vedere android:adjustViewBounds come ridimensionare ImageView per adattarlo all'immagine ridimensionata. Ad esempio, se si dispone di un'immagine rettangolare in quella che normalmente sarebbe una ImageView quadrata, AdjustViewBounds = true farà ridimensionare ImageView anche in modo rettangolare. Ciò influisce quindi sul modo in cui altre viste sono disposte attorno a ImageView.

    Quindi, come ha scritto Samuh, puoi modificare il modo in cui per impostazione predefinita ridimensiona le immagini utilizzando il android:scaleTypeparametro. A proposito, il modo più semplice per scoprire come funziona sarebbe stato sperimentare un po 'te stesso! Ricorda solo di guardare i layout nell'emulatore stesso (o in un telefono reale) poiché l'anteprima in Eclipse è generalmente sbagliata.


18
È la stessa cosa, appena fatta nel codice piuttosto che in XML. setImageBitmapè lo stesso di android:src="..."ed setBackground...èandroid:background="..."
Steve Haley,

4
@SuperUser image.setImageDrawable(...)è anche android:src="..."in xml.
PureSpider

11
"Android: AdjustViewBounds" è quello utile qui da notare! se non lo aggiungi, molto probabilmente avrai problemi con il bordo / limiti / contenitore di ImageView che non si ridimensiona correttamente.
Arrabbiato 84

2
src = vs background = è stata la differenza per me!
Christopher Rathgeb,

21
android:adjustViewBoundsè stato l'ultimo pezzo del mio puzzle, grazie!
themarketka,

281

Vedere android:adjustViewBounds.

Impostalo su true se vuoi che ImageView regoli i suoi limiti per preservare le proporzioni del suo disegno.


6
Questa è la soluzione corretta per il problema. Lo stavamo vedendo nella nostra immagine, dove l'altezza includeva tutto questo spazio extra. Non sono "pixel trasparenti", dato che avevamo fill_parent per larghezza e wrap_content per altezza. Se non disponi di AdjustViewBounds = true, otterrai lo spazio bianco aggiuntivo. Dopo aver impostato questo su true, il nostro problema è andato via. Grazie!
christophercotton,

3
grazie, impostandolo su src invece che sullo sfondo ha funzionato perfettamente!
Cameron,


1
Questa è la soluzione perfetta per il problema. Anche per le dimensioni, utilizzare il contenitore padre per impostare la dimensione e impostare match_parent in ImageView. Questo risolve molti problemi.
Nimila Hiranya,

+1 per arrivare al punto. Inizialmente l'ho scritto in una frase più "colloquiale" e Sof mi ha impedito di inviarlo. Piuttosto che volant di piume un PC andato.
Jacksonkr

168

A chiunque abbia questo particolare problema. Hai una di ImageViewcui vuoi avere una larghezza fill_parente un'altezza ridimensionate proporzionalmente:

Aggiungi questi due attributi al tuo ImageView:

android:adjustViewBounds="true"
android:scaleType="centerCrop"

E imposta la ImageViewlarghezza su fill_parente l'altezza su wrap_content.

Inoltre, se non vuoi che l'immagine venga ritagliata, prova questo:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"

16
Sì, ma l'immagine viene ritagliata. La soluzione perfetta dovrebbe estendersi alla larghezza, mantenere le proporzioni e non ritagliare. Non ho idea del perché debba essere così ansioso di farlo ...
Warpzit,

1
Neanche a me :( Mi dispiace se la mia soluzione non ti ha aiutato, ma mi ha aiutato.
Kevin Parker

2
Kevin, quello che hai detto era esattamente quello che stavo cercando, se la dimensione dell'immagine è inferiore a quella dello schermo, viene ingrandita e centrata, perfetta. Grazie.
Soham,

1
+1, tranne "(o altro View)". AFAICT nessun'altra vista ha adjustViewBoundso scaleTypeattributi.
LarsH,

che ne dici di usare android: scaleType = "centerInside" invece di android: scaleType = "centerCrop"? Inoltre, non ritaglierebbe l'immagine ma assicurerebbe che sia la larghezza che l'altezza siano inferiori o uguali alla larghezza e all'altezza della visualizzazione dell'immagine :) Ecco una buona guida visiva per i tipi di scaletta: thoughtbot.com/blog/android-imageview-scaletype-a-visual- guida
vida,

57

Se si desidera uno ImageViewche si ridimensiona su e giù mantenendo le proporzioni corrette, aggiungere questo al proprio XML:

android:adjustViewBounds="true"
android:scaleType="fitCenter"

Aggiungi questo al tuo codice:

// 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);

Mi ci è voluto un po 'per farlo funzionare, ma questo sembra funzionare nei casi in cui l'immagine è più piccola della larghezza dello schermo e più grande della larghezza dello schermo, e non racchiude l'immagine.


1
Perché non usare solo Android: scaleType = "centerCrop"?
Lukas Batteau,

funziona come un incantesimo, grazie. scaleType dipende dalla situazione, ad esempio mi serviva esattamente questo.
David,

Questo è un modo un po 'barbaro di ridimensionare la vista. Cosa succede se i limiti della vista cambiano dopo aver impostato la bitmap su ImageView? Ecco perché dovrebbe essere fatto in onMeasure (), che può essere implementato se si crea una sottoclasse personalizzata di ImageView.
Aron Lorincz,

1
Tutto ciò di cui avevo bisogno era fitCenter e AdjustViewBounds, il resto del codice almeno per me non era necessario
kingargyle

Questo funziona per me e non è necessario aggiungere alcun codice. Senza i regolatori di regolazione, se la larghezza dell'immagine era inferiore alla larghezza dell'immagine, non si ingrandiva, quindi l'altezza si fermava all'altezza nativa e sulla larghezza apparivano alcune bande.
Cristi Băluță

15

Questo ha funzionato per me:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"

10

questo ha risolto il mio problema

android:adjustViewBounds="true"
android:scaleType="fitXY"

Non conserva le proporzioni dell'immagine per me.
Dmitry,

9

Sotto il codice Funziona per l'immagine in scala come formato:

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

Dai un'occhiata a ImageView.ScaleType per controllare e capire come avviene il ridimensionamento in un file ImageView. Quando l'immagine viene ridimensionata (mantenendo le proporzioni), è probabile che l'altezza o la larghezza dell'immagine siano inferiori alle ImageViewdimensioni.


6

Utilizzare queste proprietà in ImageView per mantenere le proporzioni:

android:adjustViewBounds="true"
android:scaleType="fitXY"

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />

Solo questa risposta mi ha aiutato. Grazie!
Dmitry,

6

Ecco come ha funzionato per me all'interno di un Vincolo:

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

Quindi nel codice, ho impostato il disegno come:

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

Questo si adatta bene all'immagine in base alle proporzioni e la mantiene al centro.


5

Ho un'immagine più piccola dello schermo. Per allungarlo proporzionalmente al massimo e centrato nella vista, ho dovuto usare il seguente codice:

<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" />

Tuttavia, tieni presente che se hai un layout relativo e alcuni elementi sono impostati sopra o sotto ImageView, molto probabilmente saranno sovrapposti dall'immagine.


4

Se la qualità dell'immagine diminuisce in: utilizzare

android:adjustViewBounds="true"

invece di

android:adjustViewBounds="true"
android:scaleType="fitXY"

3

Per chiunque di voi desideri che l'immagine si adatti esattamente alla visualizzazione dell'immagine con un ridimensionamento corretto e nessun uso di ritaglio

imageView.setScaleType(ScaleType.FIT_XY);

dove imageView è la vista che rappresenta ImageView


4
No, questo cambia l'aspetto. I documenti dicono: "Scala in X e Y in modo indipendente, in modo che src corrisponda esattamente a dst. Questo può cambiare le proporzioni di src."
Rose Perrone,

A proposito, questo FIT_XY non può essere utilizzato per modificare la larghezza / altezza dell'immagine per la visualizzazione sulla visualizzazione dell'immagine.
Baia

3

È possibile calcolare la larghezza dello schermo. E puoi ridimensionare bitmap.

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

calcola la larghezza dello schermo e l'altezza dell'immagine ridimensionata in base alla larghezza dello schermo.

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

Dopo puoi ridimensionare bitmap.

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

3

Quando lo fai a livello di codice, assicurati di chiamare i setter nell'ordine corretto:

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

2

Se vuoi che la tua immagine occupi il massimo spazio possibile, l'opzione migliore sarebbe

android:layout_weight="1"
android:scaleType="fitCenter"

2

Non hai bisogno di alcun codice Java. Devi solo:

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

La chiave è nel genitore di corrispondenza per larghezza e altezza


1

Prova a utilizzare android:layout_gravityper ImageView:

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

L'esempio sopra ha funzionato per me.


1
android: layout_weight = "1" è la chiave.
nima,

1

Ho un algoritmo per ridimensionare una bitmap per adattarsi al meglio alle dimensioni del contenitore, mantenendo le proporzioni. Per favore, trova la mia soluzione qui

Spero che questo aiuti qualcuno in fondo alla strada!


0

Io lo uso questo:

<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

in caso di utilizzo cardviewper arrotondamento imageviewe riparato android:layout_heightper intestazione questo ha funzionato per me caricare l'immagineGlide

    <?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

È possibile ridimensionare l'immagine che ridurrà anche le dimensioni dell'immagine. È disponibile una libreria che puoi scaricare e utilizzare. https://github.com/niraj124124/Images-Files-scale-and-compress.git

Come usare 1) Importare il compressore-v1.0. barattolo per il tuo progetto. 2) Aggiungi il seguente codice di esempio per testare. ResizeLimiter resize = ImageResizer.build (); resize.scale ("inputImagePath", "outputImagePath", imageWidth, imageHeight); Molti altri metodi ci sono in base alle vostre esigenze


0

Passa il tuo ImageView e in base all'altezza e alla larghezza dello schermo puoi farlo

    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

Risposta rapida:

<ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="center"
        android:src="@drawable/yourImage"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

-5
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.