¿La vista de imagen de Android no respeta el ancho máximo?

113

Entonces, tengo una vista de imagen que debería mostrar una imagen arbitraria, una imagen de perfil descargada de Internet. Quiero que este ImageView escale su imagen para que quepa dentro de la altura del contenedor principal y un ancho máximo establecido de 60 dip. Sin embargo, si la imagen es alta en términos de proporción y no necesita los 60 puntos de ancho completos, el ancho de ImageView debería disminuir para que el fondo de la vista se ajuste perfectamente alrededor de la imagen.

Intenté esto

<ImageView android:id="@+id/menu_profile_picture"
    android:layout_width="wrap_content"
    android:maxWidth="60dip"
    android:layout_height="fill_parent"
    android:layout_marginLeft="2dip"
    android:padding="4dip"
    android:scaleType="centerInside"
    android:background="@drawable/menubar_button"
    android:layout_centerVertical="true"/>

pero eso hizo que ImageView fuera súper grande por alguna razón, tal vez usó el ancho intrínseco de la imagen y wrap_content para configurarlo; de todos modos, no respetó mi atributo maxWidth. ¿Eso solo funciona dentro de algunos tipos de contenedores? Está en un LinearLayout ...

¿Alguna sugerencia?

juell
fuente

Respuestas:

302

Ah,

android:adjustViewBounds="true"

es necesario para que maxWidth funcione.

¡Funciona ahora!

juell
fuente
gracias por compartir, ¿puedes marcar tu respuesta como la correcta, por favor?
WarrenFaith
1
Muchas gracias ... Funcionó bien para mí :)
Nirav Dangi
7
y programáticamente: imageView.setAdjustViewBounds (true);
Cyril Jacquart
7
Para cualquiera que se encuentre con este hallazgo, no funciona, asegúrese de que el ancho / alto no estén configurados en match_parent.
Kevin Worth
Y aquí he estado robando el ImageView interno especial de AOSP que supuestamente fue creado para respetar estos límites.
TheWanderer
4

La configuración adjustViewBoundsno ayuda si lo usa match_parent, pero la solución es personalizada simple ImageView:


public class LimitedWidthImageView extends ImageView {
    public LimitedWidthImageView(Context context) {
        super(context);
    }

    public LimitedWidthImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LimitedWidthImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int specWidth = MeasureSpec.getSize(widthMeasureSpec);
        int maxWidth = getMaxWidth();
        if (specWidth > maxWidth) {
            widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth,
                    MeasureSpec.getMode(widthMeasureSpec));
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
Sentirse bien
fuente
1
AdjustViewBounds parece funcionar bien con un ancho match_parent para mí.
Cory Petosky