Android Imageview не соблюдает maxWidth?

113

Итак, у меня есть изображение, которое должно отображать произвольное изображение, изображение профиля, загруженное из Интернета. Я хочу, чтобы ImageView масштабировал свое изображение так, чтобы оно соответствовало высоте родительского контейнера, а максимальная ширина была установлена ​​60dip. Однако, если изображение является высоким по соотношению сторон и не требует полного 60dip ширины, ширина ImageView должна уменьшиться, чтобы фон представления плотно прилегал к изображению.

Я пробовал это,

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

но это по какой-то причине сделало ImageView сверхбольшим, возможно, он использовал внутреннюю ширину изображения и wrap_content для его установки - в любом случае, он не уважал мой атрибут maxWidth .. Работает ли это только внутри некоторых типов контейнеров? Это в LinearLayout ...

Какие-либо предложения?

Джуэлл
источник

Ответы:

303

Ах,

android:adjustViewBounds="true"

требуется для работы maxWidth.

Работает сейчас!

Джуэлл
источник
спасибо за обмен, не могли бы вы отметить свой ответ как правильный, пожалуйста !?
WarrenFaith
1
Большое спасибо .. Сработало для меня хорошо :)
Nirav Dangi
7
и программно: imageView.setAdjustViewBounds (true);
Сирил Жакар
7
Для тех, кто сталкивается с этим выводом, он не работает, убедитесь, что ширина / высота не установлены на match_parent.
Кевин Уорт
И здесь я украл специальный внутренний ImageView AOSP, который якобы был создан для соблюдения этих ограничений.
TheWanderer
4

Настройка adjustViewBoundsне поможет, если вы используете match_parent, но обходной путь прост 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);
    }
}
Хорошо себя чувствовать
источник
1
AdjustViewBounds, похоже, отлично работает с шириной match_parent для меня.
Кори Петоски