Android ImageView: Ajustar el ancho
Descargue la imagen y la fijo como fondo de la pantalla dinámicamente usando Imageview
. He intentado ScaleType
, para escalar la imagen.
Si la altura de la imagen es mayor que el ancho, entonces ScaleTypes
fitStart
, fitEnd
y fitCenter
no funcionan. Android reduce la foto y la ajusta según la altura, pero veo un espacio extra en blanco como parte del ancho.
- Cámara Android: la intención de los datos devuelve null
- Android - Crossfade mutiple imágenes en un ImageView
- Tome la foto de lo que hay dentro de los límites de superposición
- Pinch Android para Zoom ImageView
- Cómo convertir BitmapDescriptor en drawable en android para imageview
Quiero reducir la foto basándome en el ancho para que se ajuste a la anchura y no me importa si hay algún espacio extra en blanco como parte de la altura o si la altura es demasiado larga, está bien si va a salir de la vista (Si es posible?).
ScaleType.XY
escala la foto y cabe todo en el ImageView
y no se preocupa por la altura de la imagen / relación de peso.
<ImageView android:id="@+id/background" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="fitStart" />
- Outofmemeoryerror (viewpager + visiones de imagen)
- Android Zoomable / desplazable ImageView con superposiciones
- Android - Lienzo drawLine dentro de ImageView
- Cómo agregar icono en la vista de imagen circular
- Cambiar la fuente de ImageView
- Cargar un vector dibujable en la vista de la imagen desde la tarjeta sd
- ¿Cómo preparo imágenes para todas las resoluciones de Android?
- ImageView no conserva la imagen cuando ocurre la rotación de la pantalla
Terminé usando este código:
<ImageView android:id="@+id/background" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/name" />
Asegúrese de establecer la imagen utilizando src
lugar de background
.
android:adjustViewBounds="true"
hace el trabajo!
Esta elegante solución encontrada aquí funcionará como un encanto para usted.
Básicamente sólo tiene que crear una clase pequeña que amplíe ImageView
y simplemente anule el método onMeasure
para ajustar el ancho y la altura como desee. Aquí se escala para ajustar el ancho utilizando:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth(); setMeasuredDimension(width, height); }
Usted utilizaría este ImageView
especial como esto:
<your.activity.package.AspectRatioImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_vertical" android:src="@drawable/test" />
Hay un método simple si simplemente desea llenar el ancho de la pantalla y tener la altura proporcional (y saber la proporción de la imagen) que puede hacer esto en OnCreate ():
setContentView(R.layout.truppview_activity); trupImage = (ImageView) findViewById(R.id.trupImage); Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics outMetrics = new DisplayMetrics(); display.getMetrics(outMetrics); float scWidth = outMetrics.widthPixels; trupImage.getLayoutParams().width = (int) scWidth; trupImage.getLayoutParams().height = (int) (scWidth * 0.6f);
Donde 0,6 es el ajuste de la relación (también se podría calcular automáticamente, por supuesto, si se conoce el w & h de la imagen).
PD:
Aquí está el lado XML:
<ImageView android:id="@+id/trupImage" android:layout_width="match_parent" android:background="@color/orange" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="fitCenter" />
Esto funciona para mí.
Crear una clase extends ImageView
package com.yourdomain.utils; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; public class ResizableImageView extends ImageView { public ResizableImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Drawable d = getDrawable(); if (d != null) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth()); setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } }
En xml utilice lo siguiente en lugar de ImageView
<com.yourdomain.utils.ResizableImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/test" />
Creo que no puedes hacerlo solo con XML, necesitas cambiar el tamaño, el mapa de bits
Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); try { ((ImageView) findViewById(R.id.background)) .setImageBitmap(ShrinkBitmap(width)); } catch (FileNotFoundException e) { e.printStackTrace(); }
entonces
private Bitmap ShrinkBitmap(int width) throws FileNotFoundException { BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); bmpFactoryOptions.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); int widthRatio = (int) android.util.FloatMath .ceil(bmpFactoryOptions.outWidth / (float) width); bmpFactoryOptions.inSampleSize = widthRatio; if (bmpFactoryOptions.inSampleSize <= 0) bmpFactoryOptions.inSampleSize = 0; bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; bmpFactoryOptions.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); return bitmap; }
Y el diseño
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="wrap_content" android:layout_height="wrap_content" />
- Cómo trabajar con diferentes resoluciones de pantalla
- Hacer una copia de seguridad de la base de datos a SDCard en Android