web-dev-qa-db-fra.com

Android imageview ne respectant pas maxWidth?

J'ai donc une image qui devrait afficher une image arbitraire, une photo de profil téléchargée sur Internet. Je veux que l'ImageView redimensionne son image pour qu'elle tienne à l'intérieur de la hauteur du conteneur parent et d'une largeur maximale définie de 60 dip. Cependant, si l'image est haute en termes de rapport et n'a pas besoin de la pleine largeur de 60dip, la largeur de l'ImageView devrait diminuer de sorte que l'arrière-plan de la vue s'adapte parfaitement à l'image.

J'ai essayé ça,

<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"/>

mais cela a rendu l'ImageView super grand pour une raison quelconque, peut-être qu'il a utilisé la largeur intrinsèque de l'image et wrap_content pour le définir - de toute façon, il n'a pas respecté mon attribut maxWidth .. Est-ce que cela ne fonctionne qu'à l'intérieur de certains types de conteneurs? C'est dans un LinearLayout ...

Aucune suggestion?

107
juell

Ah,

Android:adjustViewBounds="true"

est requis pour que maxWidth fonctionne.

Fonctionne maintenant!

287
juell

La définition de adjustViewBounds n'aide pas si vous utilisez match_parent, mais la solution de contournement est 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);
    }
}
2
FeelGood