ImageView Android ne respecte pas maxWidth?

113

Donc, j'ai une imageview qui devrait afficher une image arbitraire, une photo de profil téléchargée sur Internet. Je veux que ImageView redimensionne son image pour l'adapter à la hauteur du conteneur parent et à une largeur maximale définie de 60dip. Cependant, si l'image est haute en termes de rapport et qu'elle n'a pas besoin des 60dip complets de largeur, la largeur de ImageView doit diminuer pour 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 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 ne respectait pas mon attribut maxWidth .. Est-ce que cela ne fonctionne que dans certains types de conteneurs? C'est dans un LinearLayout ...

Aucune suggestion?

juell
la source

Réponses:

302

Ah,

android:adjustViewBounds="true"

est nécessaire pour que maxWidth fonctionne.

Fonctionne maintenant!

juell
la source
merci pour le partage, pouvez-vous marquer votre réponse comme la bonne s'il vous plaît !?
WarrenFaith
1
Merci beaucoup .. A bien fonctionné pour moi :)
Nirav Dangi
7
et par programme: imageView.setAdjustViewBounds (true);
Cyril Jacquart
7
Pour quiconque rencontre ce résultat, cela ne fonctionne pas, assurez-vous que la largeur / hauteur n'est pas définie sur match_parent.
Kevin Worth
Et ici, j'ai volé ImageView interne spéciale d'AOSP qui aurait été créée pour respecter ces limites.
TheWanderer
4

Le réglage adjustViewBoundsn'aide pas si vous utilisez match_parent, mais la solution de contournement est simple et personnalisée 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);
    }
}
Se sentir bien
la source
1
AdjustViewBounds semble fonctionner correctement avec une largeur match_parent pour moi.
Cory Petosky