L'image di Android ImageView riduce l'image in width con un'altezza flessibile senza ritagli o distorsioni

Spesso è stato chiesto, non ha mai risposto (alless non in modo riproducibile).

Ho una vista di image con un'image più piccola della vista. Voglio scalare l'image alla width dello schermo e regolare l'altezza del ImageView per riflettere l'altezza proporzionalmente corretta dell'image.

  • Invio di email con allegato tramite GMailSender?
  • Informazioni su RenderScript
  • Selettore personalizzato per lo background dell'elenco
  • android mms scarica il contenuto di mms attraverso mms url
  • Android Zxing cambia orientamento al ritratto
  • PhoneGap 1.8.1 - super.loadUrl ("file: ///android_asset/www/index.html") emissione
  • <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" /> 

    Ciò determina l'image centrata alla sua dimensione originale (più piccola della width dello schermo) con i margini laterali. Non buono.

    Così ho aggiunto

     android:adjustViewBounds="true" 

    Stesso effetto, niente di buono. Ho aggiunto

     android:scaleType="centerInside" 

    Stesso effetto, niente di buono. Ho cambiato centerInside in fitCenter . Stesso effetto, niente di buono. Ho cambiato centerInside al centerCrop .

     android:scaleType="centerCrop" 

    Ora, infine, l'image viene scalata alla width dello schermo – ma ritagliata in alto e in basso! Così ho cambiato centerCrop a fitXY .

     android:scaleType="fitXY" 

    Ora l'image viene scalata alla width dello schermo ma non scalata sull'asse y, con conseguente image distorta .

    Rimozione di android:adjustViewBounds="true" non ha alcun effetto. Aggiunta di un android:layout_gravity , come suggerito altrove, non ha ancora alcun effetto.

    Ho provato altre combinazioni – senza alcun risultato. Quindi, per favore, qualcuno sa:

    Come si imposta l'XML di un ImageView per riempire la width dello schermo, scala un'image più piccola per riempire l'intera vista, visualizzando l'image con il suo rapporto di aspetto senza distorsioni o ritaglio?

    EDIT: Ho anche provato a impostare un'altezza numbersca arbitraria. Questo ha un effetto solo con l'impostazione centerCrop . Distruggerà l'image verticalmente in base all'altezza di visualizzazione.

  • Android Studio con gradle e Google Maps v2
  • utilizzando il servizio di applicazione in un'altra applicazione
  • Che cosa è l'errore Apache-HttpClient / UNAVAILABLE (Android, Google App Engine)?
  • Memoria che non si libera dopo che il frammento viene rimosso
  • Android BroadcastReceiver non funziona dopo l'installazione
  • getActivity () restituisce null nella function Fragment
  • 7 Solutions collect form web for “L'image di Android ImageView riduce l'image in width con un'altezza flessibile senza ritagli o distorsioni”

    Ho risolto questo problema creando una class java inclusa nel tuo file di layout:

     public class DynamicImageView extends ImageView { public DynamicImageView(final Context context, final AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final Drawable d = this.getDrawable(); if (d != null) { // ceil not round - avoid thin vertical gaps along the left/right edges final int width = MeasureSpec.getSize(widthMeasureSpec); final int height = (int) Math.ceil(width * (float) d.getIntrinsicHeight() / d.getIntrinsicWidth()); this.setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } 

    Adesso, usa questo per aggiungere la tua class al tuo file di layout:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <my.package.name.DynamicImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:src="@drawable/about_image" /> </RelativeLayout> 

    Ho avuto lo stesso problema, come il tuo. Dopo 30 minuti di tentativi di diffusione diffusori ho risolto il problema in questo modo. Ti dà l' altezza flessibile e la width regolata alla width del genitore

     <ImageView android:id="@+id/imageview_company_logo" android:layout_width="fill_parent" android:layout_height="fill_parent" android:adjustViewBounds="true" android:scaleType="fitCenter" android:src="@drawable/appicon" /> 

    Non esiste una soluzione valida all'interno dello standard di layout XML.

    L'unico modo affidabile di reactjs ad una dimensione di image dynamic è utilizzare LayoutParams nel codice.

    Deludente.

      android:scaleType="fitCenter" 

    Calcola una scala che mantenga il rapporto di aspetto originale di src, ma assicurerà anche che la src si inserisca interamente in dst. Alless un asse (X o Y) si inserisce esattamente. Il risultato è centrato dentro dst.

    edit:

    Il problema qui è che il layout_height="wrap_content" non "consente" l'espansione dell'image. Dovrai impostare una dimensione per questo cambiamento

      android:layout_height="wrap_content" 

    a

      android:layout_height="100dp" // or whatever size you want it to be 

    EDIT2:

    funziona bene:

     <ImageView android:id="@+id/imageView1" android:layout_width="match_parent" android:layout_height="300dp" android:scaleType="fitCenter" android:src="@drawable/img715945m" /> 

    Questa è una piccola aggiunta all'ottima soluzione di Mark Martinsson.

    Se la width dell'image è maggiore della sua altezza, la soluzione di Mark lascerà spazio nella parte superiore e inferiore dello schermo.

    Il seguente corregge questo risultato confrontando la width e l'altezza: se la width dell'image> = altezza, scala l'altezza per adattarsi all'altezza dello schermo e quindi scalare la width per preservare il rapporto di aspetto. Allo stesso modo, se l'altezza dell'image> width, scala la width in modo che corrisponda alla width dello schermo e quindi scala l'altezza per preservare il rapporto di aspetto.

    In altre parole, soddisfa correttamente la definizione di scaleType="centerCrop" :

    http://developer.android.com/reference/android/widget/ImageView.ScaleType.html

    Scala l'image uniformsmente (mantenga l'aspetto dell'image) in modo che entrambe le size (width e altezza) dell'image siano uguali o superiori alla dimensione corrispondente della vista (less imbottitura).

     package com.mypackage; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; public class FixedCenterCrop extends ImageView { public FixedCenterCrop(final Context context, final AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final Drawable d = this.getDrawable(); if(d != null) { int height = MeasureSpec.getSize(heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); if(width >= height) height = (int) Math.ceil(width * (float) d.getIntrinsicHeight() / d.getIntrinsicWidth()); else width = (int) Math.ceil(height * (float) d.getIntrinsicWidth() / d.getIntrinsicHeight()); this.setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } 

    Questa soluzione funziona automaticamente in modalità ritratto o orizzontale. Lo si riferisce nel tuo layout proprio come fai nella soluzione di Mark. Per esempio:

     <com.mypackage.FixedCenterCrop android:id="@+id/imgLoginBackground" android:src="@drawable/mybackground" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:scaleType="centerCrop" /> 

    Mi sono imbattuto nello stesso problema, ma con un'altezza fissa, la width scalata, mantenendo l'aspetto originale dell'image. Lo ho risolto tramite un layout lineare ponderato. Si può sperare di modificarlo per le tue esigenze.

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/image" android:layout_width="0px" android:layout_height="180dip" android:layout_weight="1.0" android:adjustViewBounds="true" android:scaleType="fitStart" /> </LinearLayout> 

    Un'altra aggiunta alla soluzione di Mark Matinsson. Ho scoperto che alcune delle mie immagini erano più scalate di altre. Così ho modificato la class in modo che l'image venga scalata da un fattore massimo. Se l'image è troppo piccola per essere scalata a width massima senza diventare sfocata, si arresta la scalatura oltre il limite massimo.

     public class DynamicImageView extends ImageView { final int MAX_SCALE_FACTOR = 2; public DynamicImageView(final Context context) { super(context); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final Drawable d = this.getDrawable(); if (d != null) { // ceil not round - avoid thin vertical gaps along the left/right edges int width = View.MeasureSpec.getSize(widthMeasureSpec); if (width > (d.getIntrinsicWidth()*MAX_SCALE_FACTOR)) width = d.getIntrinsicWidth()*MAX_SCALE_FACTOR; final int height = (int) Math.ceil(width * (float) d.getIntrinsicHeight() / d.getIntrinsicWidth()); this.setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

    }

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.