Android imageview not respecting maxWidth?

AndroidScalingImageview

Android Problem Overview


So, I have an imageview that should display an arbitrary image, a profile picture downloaded from the internet. I want this the ImageView to scale its image to fit inside the height of the parent container, and a set max width of 60dip. However, if the image is tall ratio-wise, and doesn't need the full 60dip of width, the ImageView's width should decrease so the view's background fits snugly around the image.

I tried this,

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

but that made the ImageView super large for some reason, maybe it used the intrinsic width of the image and wrap_content to set it - anyway, it didn't respect my maxWidth attribute.. Does that only work inside some types of containers? It's in a LinearLayout...

Any suggestions?

Android Solutions


Solution 1 - Android

Ah,

android:adjustViewBounds="true"

is required for maxWidth to work.

Works now!

Solution 2 - Android

Setting adjustViewBounds does not help if you use match_parent, but workaround is simple custom 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);
}




}

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjuellView Question on Stackoverflow
Solution 1 - AndroidjuellView Answer on Stackoverflow
Solution 2 - AndroidFeelGoodView Answer on Stackoverflow