我想让imageView成为一个完美的正方形而不管高度

时间:2017-08-08 11:11:49

标签: android xml imageview height width

我在行布局中有一个imageView我用于recyclerView。此imageView高度设置为match_parent,但为了使其成为完美的正方形,我无法对宽度进行硬编码 imageView

我需要的是一种将imageView宽度设置为与imageView高度完全相同的方法它会显示,因为将宽度设置为wrap_contentmatch_parent会抛出其余的布局,因为它是矩形的,相当大的图像。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以这样做:

public class FixedAspectRatioFrameLayout extends FrameLayout {

private float ratio;

public FixedAspectRatioFrameLayout(@NonNull Context context) {
    super(context);
}

public FixedAspectRatioFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

private void init(Context context, AttributeSet attributeSet) {
    fillFromAttrs(context, attributeSet);
}

private void fillFromAttrs(Context context, AttributeSet attributeSet) {
    TypedArray array = context.obtainStyledAttributes(attributeSet, R.styleable.FixedAspectRatioFrameLayout);

    ratio = array.getFloat(R.styleable.FixedAspectRatioFrameLayout_ratio, 0);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int originalWidth = MeasureSpec.getSize(widthMeasureSpec);
    int originalHeight = MeasureSpec.getSize(heightMeasureSpec);

    int finalWidth = originalWidth;
    int finalHeight = originalHeight;

    if (ratio != 0) {

        if (originalHeight == 0) {
            finalHeight = (int) (originalWidth / ratio);
        } else if (originalWidth == 0) {
            finalWidth = (int) (originalHeight * ratio);
        }

    }
    super.onMeasure(
            MeasureSpec.makeMeasureSpec(finalWidth, MeasureSpec.EXACTLY),
            MeasureSpec.makeMeasureSpec(finalHeight, MeasureSpec.EXACTLY)
    );
}
}

您还需要在res / values / attrs.xml中指定属性“ratio”:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FixedAspectRatioFrameLayout">
    <attr name="ratio" format="float"/>
</declare-styleable>
</resources>

现在您可以根据需要指定此FrameLayout的高度,将宽度设置为0dp,将比率设置为1,并将ImageView放在此FrameLayout中

此外,在ConstraintLayout中,如果将height设置为匹配约束,则可以为此视图指定比率: enter image description here