ImageView adjustViewBounds not working

后端 未结 5 1583
长发绾君心
长发绾君心 2020-12-01 01:27

I have an ImageView with android:layout_width=100dp, android:layout_height=wrap_content and android:adjustViewBounds=true

It\'

5条回答
  •  悲&欢浪女
    2020-12-01 01:55

    I had a similar requirement; in my case, I wanted the image to be square, and wanted the ImageView to match the aspect ratio so I could use its background and padding to draw a border.

    I read the answers here but instead of overriding ImageView, I decided to make a Layout that guarantees its contents (should be only one view) are square. That way I could use a standard ImageView inside it. (And you never know, I might want to make something else square later. Although probably not.)

    In case it's useful for anyone else, here's the code (feel free to copy). There are probably bugs as I just made it work for my app then stopped. :)

    public class SquareLayout extends ViewGroup
    {
        public SquareLayout(Context context, AttributeSet attrs, int defStyle)
        {
            super(context, attrs, defStyle);
        }
    
        public SquareLayout(Context context, AttributeSet attrs)
        {
            super(context, attrs);
        }
    
        public SquareLayout(Context context)
        {
            super(context);
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b)
        {
            // Work out width and height, and square size.
            int width = r - l;
            int height = b - t;
    
            int size, xOffset, yOffset;
            if(width < height)
            {
                size = width;
                xOffset = 0;
                yOffset = (height - size) / 2;
            }
            else
            {
                size = height;
                xOffset = (width - size) / 2;
                yOffset = 0;
            }
    
            for(int i = 0; i < getChildCount(); i++)
            {
                View child = getChildAt(i);
                child.layout(xOffset, yOffset, size + xOffset, size + yOffset);
            }
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            // Get width and height.
            int w = -1, h = -1;
            switch(MeasureSpec.getMode(widthMeasureSpec))
            {
            case MeasureSpec.AT_MOST:
            case MeasureSpec.EXACTLY:
                w = MeasureSpec.getSize(widthMeasureSpec);
                break;
    
            case MeasureSpec.UNSPECIFIED:
                break;
            }
            switch(MeasureSpec.getMode(heightMeasureSpec))
            {
            case MeasureSpec.AT_MOST:
            case MeasureSpec.EXACTLY:
                h = MeasureSpec.getSize(heightMeasureSpec);
                break;
    
            case MeasureSpec.UNSPECIFIED:
                break;
            }
    
            // If only one of width/height is unspecified, set them both the same.
            if(w == -1 && h != -1)
            {
                w = h;
            }
            else if(h == -1 && w != -1)
            {
                h = w;
            }
    
            // Either they're both specified or both unspecified.
            int childMeasureSpec;
            if(w == -1)
            {
                childMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
            }
            else
            {
                childMeasureSpec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
            }
    
            // Pass through to children.
            int maxDimension = 1;
            for(int i = 0; i < getChildCount(); i++)
            {
                View child = getChildAt(i);
                child.measure(childMeasureSpec, childMeasureSpec);
                maxDimension = Math.max(maxDimension, child.getMeasuredWidth());
                maxDimension = Math.max(maxDimension, child.getMeasuredHeight());
            }
    
            if(w == -1)
            {
                w = maxDimension;
                h = maxDimension;
            }
    
            setMeasuredDimension(w, h);
        }
    }
    

提交回复
热议问题