2010-03-26 39 views
412

En Android, definí ImageView como layout_width como fill_parent (que ocupa todo el ancho del teléfono).Cómo escalar una imagen en ImageView para mantener la relación de aspecto

Si la imagen que pongo en ImageView es más grande que layout_width, Android lo escalará, ¿verdad? ¿Pero qué hay de la altura? Cuando Android escala la imagen, ¿mantendrá la relación de aspecto?

Lo que averiguo es que hay un espacio en blanco en la parte superior e inferior de ImageView cuando Android escala una imagen que es más grande que ImageView. ¿Es eso cierto? Si es así, ¿cómo puedo eliminar ese espacio en blanco?

Respuesta

650
  1. Sí, Android escalará su imagen por defecto para ajustarse a ImageView, manteniendo la relación de aspecto. Sin embargo, asegúrese de configurar la imagen en ImageView utilizando android:src="..." en lugar de android:background="...". src= hace que escale la relación de aspecto manteniendo la imagen, pero background= hace que la escala y distorsionen la imagen para que se ajuste exactamente al tamaño de ImageView. (Puede usar un fondo y una fuente al mismo tiempo, lo que puede ser útil para mostrar un marco alrededor de la imagen principal, usando solo un ImageView.)

  2. También debe ver android:adjustViewBounds para hacer ImageView cambiar el tamaño para ajustarse a la imagen redimensionada. Por ejemplo, si tiene una imagen rectangular en lo que normalmente sería un ImageView cuadrado, adjustViewBounds = true hará que cambie el tamaño del ImageView para que sea también rectangular. Esto luego afecta la forma en que otras Vistas se distribuyen alrededor de ImageView.

    Luego, como escribió Samuh, puede cambiar la forma en que escala las imágenes por defecto usando el parámetro android:scaleType. Por cierto, ¡la forma más fácil de descubrir cómo funciona esto simplemente hubiera sido experimentar un poco tú mismo! Simplemente recuerde mirar los diseños en el emulador mismo (o un teléfono real) ya que la vista previa en Eclipse suele ser incorrecta.

+0

Gracias. Pero, ¿qué sucede si tengo ImageView y configuro la imagen usando imageView.setImageBitmap()? – michael

+18

Es lo mismo, solo hecho en código en lugar de XML. 'setImageBitmap' es lo mismo que' android: src = "..." 'y' setBackground ... 'es' android: background = "..." ' –

+0

@SteveHaley Sé que es muy tarde, pero ¿puedes por favor? dime el equivalente a image.setImageDrawable en el código xml –

7

Eche un vistazo a ImageView.ScaleType para controlar y comprender la forma en que el cambio de tamaño ocurre en un ImageView. Cuando se cambia el tamaño de la imagen (manteniendo su relación de aspecto), es probable que la altura o el ancho de la imagen sea menor que las dimensiones de ImageView.

237

Ver android:adjustViewBounds.

Establezca esto en verdadero si desea que ImageView ajuste sus límites para conservar la relación de aspecto de su dibujo.

+6

Esta es la solución correcta para el problema. Estábamos teniendo esto en nuestra vista de imagen, donde la altura incluía todos estos espacios en blanco adicionales. No se trata de "píxeles transparentes", ya que teníamos fill_parent para ancho y wrap_content para alto. Si no tiene adjustViewBounds = true, obtendrá el espacio en blanco adicional. Después de establecer eso en verdadero, nuestro problema desapareció. ¡Gracias! – christophercotton

+3

gracias, esto y configurarlo para src en lugar de fondo funcionó a la perfección! – Cameron

+0

Vea también [cómo-escalar-mapa de bits-a-pantalla-tamaño] (http://stackoverflow.com/questions/6410364/how-to-scale-bitmap-to-screen-size) – ThomasRS

136

Para cualquier otra persona que tenga este problema en particular. Tiene una ImageView (u otro View) que desea tener una anchura de fill_parent y una altura escalado proporcionalmente:

Añadir estos dos atributos a su ImageView:

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

y establecer el ancho de ImageView a fill_parent y altura a wrap_content.

Además, si usted no quiere que su imagen que desea recortar, intente esto:

android:adjustViewBounds="true" 
android:layout_centerInParent="true" 
+14

Sí, pero su imagen se recorta.La solución perfecta sería estirar al ancho, mantener la relación de aspecto y no recortar. No tengo ni idea de por qué tiene que ser tan difícil ... – Warpzit

+1

Yo :(Disculpa si mi solución no te ayudó, pero sí me ayudó. –

+2

Kevin, lo que dijiste era exactamente lo que estaba buscando, si el tamaño de la imagen es menor que el de la pantalla, se acerca y se centra, perfecto. Gracias. – Soham

45

Si desea una ImageView que ambas escalas arriba y abajo mientras se mantiene la relación de aspecto correcta, añadir esto a su XML:

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

Agregar a su código:

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

me tomó un wh Esto puede funcionar en los casos donde la imagen es más pequeña que el ancho de la pantalla y más grande que el ancho de la pantalla, y no recubre la imagen.

+1

¿Por qué no usar solo android: scaleType =" centerCrop "? –

+0

funciona como un amuleto, gracias. scaleType depende de la situación, por ejemplo, necesitaba exactamente esto. – David

+0

Esta es una forma un poco bárbara de cambiar el tamaño de la vista. ¿Qué sucede si los límites de vista cambian después de establecer el mapa de bits en ImageView? Es por eso que debe hacerse en onMeasure(), que se puede implementar si se crea una subclase personalizada de ImageView. –

2

Si desea que la imagen ocupe el máximo espacio posible, entonces la mejor opción sería

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

tengo una imagen más pequeña que la pantalla. Para que se extendía de forma proporcional al máximo y centrada en la vista que tenía que utilizar el siguiente código:

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

Tenga en cuenta sin embargo, que si se tiene un esquema relativo y ha establecido algunos elementos para estar por encima o por debajo ImageView, lo más probable es que estén superpuestos por la imagen.

3

Para cualquiera de ustedes que quiere la imagen al tamaño exacto del imageview con la escala adecuada y sin el uso de cultivos

imageView.setScaleType(ScaleType.FIT_XY); 

donde imageView es la vista que representa su ImageView

+4

No, esto cambia la relación de aspecto. Los documentos dicen: "Escale en X e Y de forma independiente, para que src coincida exactamente con dst. Esto puede cambiar la relación de aspecto del src". –

+0

Por cierto, este FIT_XY no se puede usar para cambiar el ancho/alto de la imagen para mostrar en la vista de la imagen. – Bay

7

Esto funcionó para mí:

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

utilizo este:

<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" /> 
-1
myImageView.setAdjustViewBounds(true); 
1

Intente utilizar android:layout_gravity para ImageView:

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

El ejemplo anterior trabajó para mí.

+0

android: layout_weight = "1" es la clave. – nima

-3
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false)); 
1

Tengo un algoritmo para escalar un mapa de bits a bestFit las dimensiones del contenedor, manteniendo su relación de aspecto. Encuentre mi solución here

Espero que esto ayude a alguien en el camino!

8

A continuación código imagen Trabajo escala para que la relación de aspecto:

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

Se puede calcular el ancho de la pantalla. Y puedes escalar el mapa de bits. ancho de la pantalla

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

Calcular y altura de la imagen escalada por ancho de la pantalla.

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

Después de que pueda escalar el mapa de bits.

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

Pass your imageview and based on screen height and width you can make it 

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

3

utilizar estas propiedades en ImageView para mantener la relación de aspecto:

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

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

Yo no necesitan ningún código de Java. Sólo tienes que:

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

La clave está en la matriz partido para la anchura y la altura

3

Al hacer esto mediante programación, asegúrese de llamar a los fijadores en el orden correcto:

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

esto resolvió mi problema

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