ImageView - have height match width?

后端 未结 14 2415
长发绾君心
长发绾君心 2020-12-02 05:17

I have an imageview. I want its width to be fill_parent. I want its height to be whatever the width ends up being. For example:



        
相关标签:
14条回答
  • 2020-12-02 06:04

    Update: Sep 14 2017

    According to a comment below, the percent support library is deprecated as of Android Support Library 26.0.0. This is the new way to do it:

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            app:layout_constraintDimensionRatio="1:1" />
    
    </android.support.constraint.ConstraintLayout>
    

    See here

    Deprecated:

    According to this post by Android Developers, all you need to do now is to wrap whatever you want within a PercentRelativeLayout or a PercentFrameLayout, and then specify its ratios, like so

    <android.support.percent.PercentRelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <ImageView
            app:layout_widthPercent="100%"
            app:layout_aspectRatio="100%"/>
    
    </android.support.percent.PercentRelativeLayout>
    
    0 讨论(0)
  • 2020-12-02 06:06

    Here's how I solved that problem:

    int pHeight =  picture.getHeight();
    int pWidth = picture.getWidth();
    int vWidth = preview.getWidth();
    preview.getLayoutParams().height = (int)(vWidth*((double)pHeight/pWidth));
    

    preview - imageView with width setted to "match_parent" and scaleType to "cropCenter"

    picture - Bitmap object to set in imageView src.

    That's works pretty well for me.

    0 讨论(0)
  • 2020-12-02 06:08

    You can't do it with the layout alone, I've tried. I ended up writing a very simple class to handle it, you can check it out on github. SquareImage.java Its part of a larger project but nothing a little copy and paste can't fix (licensed under Apache 2.0)

    Essentially you just need to set the height/width equal to the other dimension (depending on which way you want to scale it)

    Note: You can make it square without a custom class using the scaleType attribute but the view's bounds extend beyond the visible image, which makes it an issue if you are placing other views near it.

    0 讨论(0)
  • 2020-12-02 06:10

    For people passing by now, in 2017, the new best way to achieve what you want is by using ConstraintLayout like this:

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scaleType="centerCrop"
        app:layout_constraintDimensionRatio="1:1" />
    

    And don't forget to add constraints to all of the four directions as needed by your layout.

    Build a Responsive UI with ConstraintLayout

    Furthermore, by now, PercentRelativeLayout has been deprecated (see Android documentation).

    0 讨论(0)
  • 2020-12-02 06:12

    Here I what I did to have an ImageButton which always have a width equals to its height (and avoid stupid empty margins in one direction...which I consider a as a bug of the SDK...):

    I defined a SquareImageButton class which extends from ImageButton:

    package com.myproject;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.widget.ImageButton;
    
        public class SquareImageButton extends ImageButton {
    
            public SquareImageButton(Context context) {
            super(context);
    
    
            // TODO Auto-generated constructor stub
        }
    
        public SquareImageButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
    
        }
    
        public SquareImageButton(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
    
        }
    
        int squareDim = 1000000000;
    
        @Override
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
    
            int h = this.getMeasuredHeight();
            int w = this.getMeasuredWidth();
            int curSquareDim = Math.min(w, h);
            // Inside a viewholder or other grid element,
            // with dynamically added content that is not in the XML,
            // height may be 0.
            // In that case, use the other dimension.
            if (curSquareDim == 0)
                curSquareDim = Math.max(w, h);
    
            if(curSquareDim < squareDim)
            {
                squareDim = curSquareDim;
            }
    
            Log.d("MyApp", "h "+h+"w "+w+"squareDim "+squareDim);
    
    
            setMeasuredDimension(squareDim, squareDim);
    
        }
    
    }
    

    Here is my xml:

    <com.myproject.SquareImageButton
                android:id="@+id/speakButton"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:scaleType="centerInside"
                android:src="@drawable/icon_rounded_no_shadow_144px"
                android:background="#00ff00"
                android:layout_alignTop="@+id/searchEditText"
                android:layout_alignBottom="@+id/searchEditText"
                android:layout_alignParentLeft="true"
               />
    

    Works like a charm !

    0 讨论(0)
  • 2020-12-02 06:12

    i did like this -

    layout.setMinimumHeight(layout.getWidth());
    
    0 讨论(0)
提交回复
热议问题