android - studio - Cómo escalar una imagen en ImageView para mantener la relación de aspecto
bajar calidad imagen android studio (22)
En Android, layout_width
el layout_width
ImageView
como fill_parent
(que ocupa todo el ancho del teléfono).
Si la imagen que coloco en ImageView
es más grande que el layout_width
, Android la escalará, ¿verdad? Pero ¿qué pasa con la altura? Cuando Android escala la imagen, ¿mantendrá la relación de aspecto?
Lo que descubro 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?
Sí, de forma predeterminada, Android reducirá su imagen para que se ajuste a ImageView, manteniendo la relación de aspecto. Sin embargo, asegúrese de que está configurando la imagen en ImageView con
android:src="..."
lugar deandroid:background="..."
.src=
hace escalar la imagen manteniendo la relación de aspecto, perobackground=
hace escalar y distorsionar la imagen para que se ajuste exactamente al tamaño de ImageView. (Sin embargo, puede usar un fondo y una fuente al mismo tiempo, lo que puede ser útil para cosas como mostrar un marco alrededor de la imagen principal, usando solo un ImageView).También debería ver
android:adjustViewBounds
para hacer que ImageView se redimensione a sí mismo para que se ajuste a la imagen reescalada. Por ejemplo, si tiene una imagen rectangular en lo que normalmente sería un ImageView cuadrado, adjustViewBounds = true hará que el tamaño de ImageView sea rectangular también. Esto afecta a la forma en que otras vistas se distribuyen alrededor de ImageView.Luego, como escribió Samuh, puedes cambiar la forma en que
android:scaleType
defecto las imágenes con el parámetroandroid:scaleType
. Por cierto, ¡la forma más fácil de descubrir cómo funciona esto sería simplemente experimentar un poco tú mismo! Solo recuerde mirar los diseños en el propio emulador (o en un teléfono real) ya que la vista previa en Eclipse suele ser incorrecta.
A cualquier otra persona que tenga este problema en particular. Tiene un ImageView
(u otra View
) que desea que tenga un ancho de fill_parent
y una altura escalada proporcionalmente:
Agregue estos dos atributos a su ImageView
:
android:adjustViewBounds="true"
android:scaleType="centerCrop"
Y establezca el ancho de ImageView
en fill_parent
y el alto en wrap_content
.
Además, si no quieres que tu imagen sea recortada, prueba esto:
android:adjustViewBounds="true"
android:layout_centerInParent="true"
Al hacer esto mediante programación, asegúrese de llamar a los configuradores en el orden correcto:
imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
Debajo del código Trabajando para la imagen de escala como 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);
Eche un vistazo a ImageView.ScaleType para controlar y comprender la forma en que se produce el cambio de tamaño en un ImageView
. Cuando se cambia el tamaño de la imagen (mientras se mantiene su relación de aspecto), es probable que la altura o el ancho de la imagen sean más pequeños que las dimensiones de ImageView
.
Esto funcionó para mí:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"
No necesitas ningún código 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 el elemento principal para el ancho y la altura
Para cualquiera de ustedes que quiera que la imagen se ajuste exactamente a la vista de la imagen con una escala adecuada y sin uso de recorte
imageView.setScaleType(ScaleType.FIT_XY);
donde imageView es la vista que representa su ImageView
Puedes calcular el ancho de la pantalla. Y puedes escalar el mapa de bits.
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 el ancho de la pantalla y la altura de la imagen escalada por el 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 se puede escalar el mapa de bits.
Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);
Si desea que su imagen ocupe el máximo espacio posible, la mejor opción sería
android:layout_weight="1"
android:scaleType="fitCenter"
Si desea un ImageView
que ImageView
o disminuya la escala mientras mantiene la relación de aspecto adecuada, agregue esto a su XML:
android:adjustViewBounds="true"
android:scaleType="fitCenter"
Agregue esto 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 tiempo hacer que esto funcionara, pero esto parece funcionar en los casos en que 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 encuadra la imagen.
Tengo un algoritmo para escalar un mapa de bits para ajustarse mejor a las dimensiones del contenedor, manteniendo su relación de aspecto. Por favor encuentre mi solución here
Espero que esto ayude a alguien por el camino!
Tengo una imagen más pequeña que la pantalla. Para estirarlo proporcionalmente al máximo y centrado en la vista, tuve que usar 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" />
Sin embargo, tenga en cuenta que si tiene un diseño relativo y tiene algunos elementos configurados para estar por encima o por debajo de ImageView, lo más probable es que la imagen se superponga.
Trate de usar 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 funcionó para mí.
Utilice 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"
/>
Ver android:adjustViewBounds
.
Establézcalo en verdadero si desea que ImageView ajuste sus límites para preservar la relación de aspecto de su dibujo.
Yo uso esto:
<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" />
en el caso de usar cardview
para redondear imageview
y android:layout_height
fijo android:layout_height
para encabezado, esto me android:layout_height
para cargar imagen con Glide
<?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>
esto resolvió mi problema
android:adjustViewBounds="true"
android:scaleType="fitXY"
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);
}
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));
myImageView.setAdjustViewBounds(true);