Android-Bildansicht respektiert maxWidth nicht?

113

Ich habe also eine Bildansicht, die ein beliebiges Bild anzeigen soll, ein Profilbild, das aus dem Internet heruntergeladen wurde. Ich möchte, dass ImageView sein Bild so skaliert, dass es in die Höhe des übergeordneten Containers passt, und eine festgelegte maximale Breite von 60dip. Wenn das Bild jedoch im Verhältnis groß ist und nicht die volle Breite von 60 dip benötigt, sollte die Breite der ImageView verringert werden, damit der Hintergrund der Ansicht genau um das Bild passt.

Ich habe es versucht,

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

Aber das hat die ImageView aus irgendeinem Grund sehr groß gemacht. Vielleicht hat sie die intrinsische Breite des Bildes und wrap_content verwendet, um sie festzulegen. Trotzdem hat sie mein maxWidth-Attribut nicht berücksichtigt. Funktioniert das nur in einigen Containertypen? Es ist in einem LinearLayout ...

Irgendwelche Vorschläge?

juell
quelle

Antworten:

302

Ah,

android:adjustViewBounds="true"

ist erforderlich, damit maxWidth funktioniert.

Funktioniert jetzt!

juell
quelle
Danke fürs Teilen, kannst du deine Antwort bitte als die richtige markieren?
WarrenFaith
1
Vielen Dank. Hat gut für mich
funktioniert
7
und programmgesteuert: imageView.setAdjustViewBounds (true);
Cyril Jacquart
7
Wenn jemand auf diese Feststellung stößt, funktioniert sie nicht. Stellen Sie sicher, dass Breite / Höhe nicht auf match_parent eingestellt sind.
Kevin Worth
Und hier habe ich AOSPs spezielle interne ImageView gestohlen, die angeblich erstellt wurde, um diese Grenzen zu respektieren.
TheWanderer
4

Die Einstellung adjustViewBoundshilft nicht, wenn Sie verwenden match_parent, aber die Problemumgehung ist einfach benutzerdefiniert 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);
    }
}
Gut fühlen
quelle
1
adjustViewBounds scheint mit einer match_parent-Breite für mich gut zu funktionieren.
Cory Petosky