android layout - relacion - ¿Cómo estirar tres imágenes en la pantalla conservando la relación de aspecto?
redimensionar imagenes android studio (4)
Necesito mostrar tres imágenes del mismo tamaño (200 X 100) una al lado de la otra (sin espacios) en la parte superior de la pantalla. Deben ocupar todo el ancho de la pantalla y conservar la relación de aspecto. ¿Es posible lograr eso usando solo el archivo xml de diseño, o necesito usar el código de Java?
La solución debe ser independiente de la resolución ... ¿Alguien puede publicar una solución o un enlace para este problema (o similar)? ¡Gracias!
Jake Wharton mejora la clase AspectRatioImageView, puede establecer dominantMeasurement y aspectRatio mediante xml. Puedes encontrarlo en el siguiente enlace.
Lo tengo trabajando! Pero como dije antes, necesitas crear tu propia clase. Pero es bastante pequeño. Lo creé con la ayuda de la respuesta de Bob Lee en esta publicación: Android: ¿Cómo estirar una imagen al ancho de la pantalla mientras se mantiene la relación de aspecto?
package com.yourpackage.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
public class AspectRatioImageView extends ImageView {
public AspectRatioImageView(Context context) {
super(context);
}
public AspectRatioImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
setMeasuredDimension(width, height);
}
}
Ahora para usarlo en el XML:
<com.yourpackage.widgets.AspectRatioImageView
android:id="@+id/image"
android:src="@drawable/yourdrawable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:adjustViewBounds="true" />
¡Que te diviertas!
==================================
Encontré otra forma de hacer lo mismo solo en XML usando android: adjustViewBounds = "true". Aquí un ejemplo:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:adjustViewBounds="true"
android:src="@drawable/image1" />
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:adjustViewBounds="true"
android:src="@drawable/image2" />
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:adjustViewBounds="true"
android:src="@drawable/image2" />
</LinearLayout>
No sé sobre los diseños XML y la API de Android, pero la matemática es simple; encuentra el ancho de la pantalla y divídelo por tres. Ese es el ancho de cada imagen. Ahora multiplica el ancho por la relación de la imagen original de Alto a Ancho. Esa es la altura de cada imagen.
int imageWidth = screenWidth / 3;
float ratio = originalImage.Height / (float)originalImage.Width;
int imageHeight = (int)(imageWidth * ratio);
Solo una pequeña mejora para tener en cuenta lo que podría ir mal: nulo Drawable o 0 width.
package com.yourpackage.yourapp;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class AspectRatioImageView extends ImageView {
public AspectRatioImageView(Context context)
{
super(context);
}
public AspectRatioImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public AspectRatioImageView(Context context, AttributeSet attrs,
int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
Drawable drawable = getDrawable();
if (drawable != null)
{
int width = MeasureSpec.getSize(widthMeasureSpec);
int diw = drawable.getIntrinsicWidth();
if (diw > 0)
{
int height = width * drawable.getIntrinsicHeight() / diw;
setMeasuredDimension(width, height);
}
else
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
else
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}