Android imageview nie respektuje maxWidth?

113

Mam więc widok obrazu, który powinien wyświetlać dowolny obraz, zdjęcie profilowe pobrane z Internetu. Chcę, aby ImageView skalował swój obraz w celu dopasowania do wysokości kontenera nadrzędnego i ustawioną maksymalną szerokość 60dip. Jeśli jednak obraz ma wysoki współczynnik proporcji i nie potrzebuje pełnego 60dip szerokości, szerokość ImageView powinna się zmniejszyć, aby tło widoku było dobrze dopasowane do obrazu.

Próbowałem tego,

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

ale to sprawiło, że ImageView z jakiegoś powodu był bardzo duży, być może używał wewnętrznej szerokości obrazu i wrap_content, aby go ustawić - w każdym razie nie uwzględniał mojego atrybutu maxWidth. Czy to działa tylko w niektórych typach kontenerów? Jest w układzie liniowym ...

Jakieś sugestie?

Juell
źródło

Odpowiedzi:

302

Ach,

android:adjustViewBounds="true"

jest wymagany do działania maxWidth.

Działa teraz!

Juell
źródło
dzięki za udostępnienie, czy możesz oznaczyć swoją odpowiedź jako właściwą !?
WarrenFaith
1
Wielkie dzięki. Dobrze mi
wyszło
7
i programowo: imageView.setAdjustViewBounds (true);
Cyril Jacquart
7
Dla każdego, kto napotka ten wynik, nie działa, upewnij się, że szerokość / wysokość nie są ustawione na match_parent.
Kevin Worth
I tutaj kradnąłem specjalny wewnętrzny ImageView AOSP, który rzekomo został stworzony, aby szanować te ograniczenia.
TheWanderer
4

Ustawienie adjustViewBoundsnie pomaga, jeśli używasz match_parent, ale obejście jest proste, niestandardowe 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);
    }
}
Czuć się dobrze
źródło
1
Wygląda na to, że adjustViewBounds działa dobrze z szerokością match_parent.
Cory Petosky