我有一个imageview。我想让它的宽度为fill_parent。我想让它的高等于宽度。例如:

<ImageView
  android:layout_width="fill_parent"
  android:layout_height="whatever the width ends up being" />

在布局文件中,不需要创建自己的视图类,这样的事情可能吗?

谢谢


当前回答

2021年7月28日更新,使用AndroidX而不是支持库

首先,确保你的项目导入了AndroidX,按照下面的说明操作。

然后将你的图像包装在一个ConstraintLayout中,它的字段如下:

<androidx.constraintlayout.widget.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" />

</androidx.constraintlayout.widget.ConstraintLayout>

在这里看到的

其他回答

对于现在路过的人,在2017年,实现你想要的最好的新方法是使用这样的ConstraintLayout:

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

不要忘记根据你的布局需要在所有四个方向上添加约束。

用ConstraintLayout构建一个响应式UI

此外,到目前为止,PercentRelativeLayout已经被弃用(参见Android文档)。

我不能让David Chu的答案为RecyclerView项工作,并找出我需要约束ImageView到父。设置ImageView宽度为0dp,并将其开始和结束约束为父对象。我不确定是否设置宽度wrap_content或match_parent在某些情况下工作,但我认为这是一个更好的方式,让一个ConstraintLayout的子填充它的父。

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintDimensionRatio="1:1"/>

</androidx.constraintlayout.widget.ConstraintLayout>

光靠布局是做不到的,我试过了。我最终写了一个非常简单的类来处理它,你可以在github上查看。它是一个更大项目的一部分,但一点复制和粘贴就能解决问题(在Apache 2.0下授权)

本质上,你只需要设置高度/宽度等于另一个维度(取决于你想缩放它的方式)

注意:您可以使用scaleType属性在不使用自定义类的情况下将其设置为正方形,但视图的边界超出了可见图像,如果将其他视图放置在其附近,则会产生问题。

ImageView "scaleType"函数可以帮助你。

这段代码将保持图像的纵横比和位置在顶部:

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitStart"

这里有一个很棒的帖子展示了使用scaleType的可能性和外观。

ImageView scaleType样本

为了将ImageView设置为屏幕的一半,你需要为ImageView添加以下内容:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:scaleType="fitXY"
    android:adjustViewBounds="true"/>

然后将高度设置为宽度,需要在代码中完成。在你的GridView适配器的getView方法中,设置ImageView的高度等于它的测量宽度:

mImageView.getLayoutParams().height = mImageView.getMeasuredWidth();