Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android ImageView que ajusta la altura de los padres y el ancho de ajuste

Actualización : he resuelto este problema mediante el método descrito en esta respuesta

Estoy un poco atascado con este problema, que creo que debería ser bastante simple.

Así que mi aplicación descarga una imagen y procesa el mapa de bits en un ImageView, un elemento secundario de un RelativeLayout. Me gustaría que el ImageView se ajustara al ancho de los padres, y adaptar su tamaño para mantener la relación de aspecto.

Aquí está mi XML:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:id="@+id/banner" android:layout_width="fill_parent" android:layout_height="wrap_content"></RelativeLayout> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 

Y el código:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); RelativeLayout banner = (RelativeLayout) findViewById(R.id.banner); ImageView imgV = new ImageView(this); imgV.setScaleType(ImageView.ScaleType.CENTER_CROP); // I tried all the scale types : CENTER_INSIDE : same effect, FIT_CENTER : same effect... imgV.setBackgroundColor(0x00FFFF00); imgV.setAdjustViewBounds(Color.BLUE); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); banner.addView(imgV,params); // Some code downloading the image stream bitmap = BitmapFactory.decodeStream(stream); imgV.setImageBitmap(bitmap); } 

Deseado:

Resultado deseado

Resultado:

Resultado actual

  • Comprensión del uso de ImageView Matrix
  • Subir imagen al servidor en Multipart junto con datos JSON en Android
  • Incluir OpenCV en el paquete de aplicaciones de Android
  • Android scrollview horizontal se comportan como el iPhone (paginación)
  • Procesamiento de imágenes con Android Camera
  • Cómo actualizar la vista de imagen inmediatamente
  • Zoom y panorámica de ImageView Android
  • Compartir imagen con ShareActionProvider de Picasso
  • 5 Solutions collect form web for “Android ImageView que ajusta la altura de los padres y el ancho de ajuste”

    Gracias a @Julien y @js. Aquí está la solución completa de ImageView que estirará la altura de mapa de bits preservando la relación de aspecto incluso si el mapa de bits es más pequeño que 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){ // ceil not round - avoid thin vertical gaps along the left/right edges 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); } } } 

    Puede utilizar esta clase en sus diseños xml en lugar de ImageView.

     <com.example.ResizableImageView android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/banner" /> 

    Probablemente estés buscando android:adjustViewBounds="true" en xml o imageView.setAdjustViewBounds(true) en Java.

    Como mencioné en un comentario, subclase el ImageView. He encontrado mi código, aquí tienes:

      protected class ResizableImageView extends ImageView { private Bitmap mBitmap; // Constructor public ResizableImageView(Context context) { super(context); } // Overriden methods @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if(mBitmap != null) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = width * mBitmap.getHeight() / mBitmap.getWidth(); setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } @Override public void setImageBitmap(Bitmap bitmap) { mBitmap = bitmap; super.setImageBitmap(bitmap); } } 

    Creo que deberías cambiar tu ancho de imgV a "match_parent"

    Debe cambiar el tipo de escala a imgV.setScaleType (ImageView.ScaleType.CENTER_INSIDE);

    Hice un ligero cambio en la solución de @Seraphim S para tener en cuenta casos en los que la imagen puede ser amplia y los límites de la vista también son amplios (por ejemplo, girar el dispositivo a modo horizontal).

     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 = MeasureSpec.getSize(heightMeasureSpec); if (width >= height) { width = (int) Math.ceil((float) height * (float) d.getIntrinsicWidth() / (float) d.getIntrinsicHeight()); } else { height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth()); } setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.