android -> 将 ImageView 的高度设置为父级的动态高度

Posted

技术标签:

【中文标题】android -> 将 ImageView 的高度设置为父级的动态高度【英文标题】:android -> set height of ImageView to dynamic height of parent 【发布时间】:2021-03-24 08:35:56 【问题描述】:

我有动态高度的单元格的 recyclerview。 单元格的高度取决于文本的长度。

我想为这个单元格设置背景封面。 ImageView 的高度必须与父视图的高度相同。 令人惊讶的是,完成这项任务真的很难。

这是没有 ImageView 的结果布局

如您所见,单元格的高度取决于文本的长度。

使用 ImageView 的结果布局。

如您所见,单元格的高度取决于图像高度。

<?xml version="1.0" encoding="utf-8"?>

<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cardview"
    app:cardBackgroundColor="#FF6B6B"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginRight="16dp"
    android:layout_marginLeft="16dp"
    android:layout_
    android:layout_
    app:cardCornerRadius="8dp">

    <FrameLayout
        android:layout_
        android:layout_>
        <ImageView
            android:src="@drawable/universe1"
            android:id="@+id/background"
            android:layout_
            android:layout_
            android:scaleType="centerCrop">
        </ImageView>
        <LinearLayout
            android:id="@+id/layout_text"
            android:layout_
            android:layout_
            android:orientation="vertical">
            <TextView
                android:layout_marginLeft="8dp"
                android:textColorLink="@color/white"
                android:layout_marginBottom="8dp"
                android:id="@+id/text"
                android:layout_
                android:layout_
                android:layout_marginTop="2dp"
                android:ellipsize="end"
                android:fontFamily="@font/compact_text_regular"
                android:maxLines="4"
                android:text="This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah"
                android:textColor="@color/white"
                android:textSize="14sp"
                android:lineSpacingExtra="4dp" />

            <LinearLayout
                android:layout_
                android:layout_
                android:orientation="horizontal">

                <LinearLayout
                    android:visibility="gone"
                    android:id="@+id/like_icon_wrap"
                    android:clickable="true"
                    android:layout_gravity="center"
                    android:layout_
                    android:layout_
                    android:orientation="horizontal">

                    <ImageView
                        android:layout_marginLeft="8dp"
                        android:id="@+id/like_icon"
                        android:layout_gravity="center_vertical"
                        android:layout_
                        android:layout_
                        app:srcCompat="@drawable/heart_white" />

                    <TextView
                        android:id="@+id/likes_count"
                        android:layout_gravity="center"
                        android:layout_
                        android:layout_
                        android:fontFamily="@font/compact_text_regular"
                        android:textColor="@color/white"
                        android:textSize="16sp"
                        android:text="0" />
                </LinearLayout>

                <TextView
                    android:layout_marginRight="8dp"
                    android:layout_gravity="center"
                    android:id="@+id/more"
                    android:layout_
                    android:layout_
                    android:layout_weight="1"
                    android:fontFamily="sans-serif"
                    android:textColor="@color/colorPrimary"
                    android:gravity="right"
                    android:text="show more"
                    android:textSize="12sp"
                    android:visibility="invisible" />
            </LinearLayout>
        </LinearLayout>
    </FrameLayout>
</androidx.cardview.widget.CardView>

我也尝试从 recyclerview 适配器设置图像高度,但没有成功。

【问题讨论】:

【参考方案1】:

使用ConstraintLayout,您可以通过将高度设置为0dp 并将顶部/底部限制到您要匹配的另一个视图来匹配另一个视图高度

我剪掉了布局的其他部分,因此您必须添加它们,但下面是图像和文本的代码。 Produce this

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/cardview"
    app:cardBackgroundColor="#FF6B6B"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginRight="16dp"
    android:layout_marginLeft="16dp"
    android:layout_
    android:layout_
    app:cardCornerRadius="8dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        android:layout_>

        <ImageView
            android:id="@+id/background"
            android:layout_
            android:layout_

            tools:src="@tools:sample/avatars"
            android:scaleType="centerCrop"

            app:layout_constraintStart_toStartOf="@id/text"
            app:layout_constraintEnd_toEndOf="@id/text"
            app:layout_constraintTop_toTopOf="@id/text"
            app:layout_constraintBottom_toBottomOf="@id/text" />

        <TextView
            android:id="@+id/text"
            android:layout_
            android:layout_

            android:ellipsize="end"
            android:lineSpacingExtra="4dp"
            android:maxLines="4"
            android:text="This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

【讨论】:

【参考方案2】:

正确的方法是使用@Håkon Schia 代码。 但是如果你想使用 FrameLayout 然后像这样在 RelativeLayout 中添加它,并在其中添加 ImageView 并带有“alignBottom”约束:

<?xml version="1.0" encoding="utf-8"?>

<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cardview"
    app:cardBackgroundColor="#FF6B6B"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginRight="16dp"
    android:layout_marginLeft="16dp"
    android:layout_
    android:layout_
    app:cardCornerRadius="8dp">

    <!--
        Code added here...
    -->
    <RelativeLayout
        android:layout_
        android:layout_>

    <ImageView
        android:id="@+id/background"
        android:background="@drawable/universe1"
        android:layout_
        android:layout_
        android:layout_alignBottom="@+id/frameLayout"
        android:scaleType="centerCrop">
    </ImageView>

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_
        android:layout_>
        <!--<ImageView
            android:src="@drawable/universe1"
            android:layout_
            android:layout_
            android:scaleType="centerCrop">
        </ImageView>-->
        <LinearLayout
            android:id="@+id/layout_text"
            android:layout_
            android:layout_
            android:orientation="vertical">
            <TextView
                android:layout_marginLeft="8dp"
                android:textColorLink="@color/white"
                android:layout_marginBottom="8dp"
                android:id="@+id/text"
                android:layout_
                android:layout_
                android:layout_marginTop="2dp"
                android:ellipsize="end"
                android:fontFamily="@font/compact_text_regular"
                android:maxLines="4"
                android:text="This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah This sounded nonsense to Alice, so she said nothing, but set off at her being blah blah"
                android:textColor="@color/white"
                android:textSize="14sp"
                android:lineSpacingExtra="4dp" />

            <LinearLayout
                android:layout_
                android:layout_
                android:orientation="horizontal">

                <LinearLayout
                    android:visibility="gone"
                    android:id="@+id/like_icon_wrap"
                    android:clickable="true"
                    android:layout_gravity="center"
                    android:layout_
                    android:layout_
                    android:orientation="horizontal">

                    <ImageView
                        android:layout_marginLeft="8dp"
                        android:id="@+id/like_icon"
                        android:layout_gravity="center_vertical"
                        android:layout_
                        android:layout_
                        app:srcCompat="@drawable/heart_white" />

                    <TextView
                        android:id="@+id/likes_count"
                        android:layout_gravity="center"
                        android:layout_
                        android:layout_
                        android:fontFamily="@font/compact_text_regular"
                        android:textColor="@color/white"
                        android:textSize="16sp"
                        android:text="0" />
                </LinearLayout>

                <TextView
                    android:layout_marginRight="8dp"
                    android:layout_gravity="center"
                    android:id="@+id/more"
                    android:layout_
                    android:layout_
                    android:layout_weight="1"
                    android:fontFamily="sans-serif"
                    android:textColor="@color/colorPrimary"
                    android:gravity="right"
                    android:text="show more"
                    android:textSize="12sp"
                    android:visibility="invisible" />
            </LinearLayout>
        </LinearLayout>
    </FrameLayout>
    </RelativeLayout>
</androidx.cardview.widget.CardView>

【讨论】:

以上是关于android -> 将 ImageView 的高度设置为父级的动态高度的主要内容,如果未能解决你的问题,请参考以下文章

Android:将imageview中的图像旋转一个角度

Android 将 ImageView 放在地图的赤道上

android:将灰度过滤器设置为imageView

Android - 将 ImageView 保存到具有全分辨率图像的文件

Android - 将ImageView设置为URL

无法将图像从ImageView上传到Android中的FireBase存储