layout_constraintDimensionRatio的意外行为

Unexpected behavior of layout_constraintDimensionRatio

提问人:pequeñaluna 提问时间:9/23/2023 更新时间:9/24/2023 访问量:25

问:

据我所知,如果我在一个元素中使用,该元素的高度将是固定的,然后宽度将适应与宽度相同的大小,但在以下示例中,高度不是固定的。app:layout_constraintDimensionRatio="H,1:1

这是代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/gd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.1" />

    <View
        android:id="@+id/v1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toTopOf="@id/gd"
        app:layout_constraintDimensionRatio="H,1:1"
        android:background="@color/blue"
        app:layout_constraintHorizontal_bias="1.0"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

我期望发生的事情:

enter image description here

真实情况:

enter image description here

奇怪的事实

如果我在我拥有的视图旁边添加另一个具有相同视图的视图(形成两个视图的水平链),它现在神秘地按预期工作。app:layout_constraintDimensionRatio="H,1:1"app:layout_constraintDimensionRatio="H,1:1"

现在具有两个视图的代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/gd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.1" />

    <View
        android:id="@+id/v1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintEnd_toStartOf="@id/v2"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toTopOf="@id/gd"
        app:layout_constraintDimensionRatio="H,1:1"
        android:background="@color/blue"
        />


    <View
        android:id="@+id/v2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@id/v1"
        app:layout_constraintBottom_toTopOf="@id/gd"
        app:layout_constraintDimensionRatio="H,1:1"
        android:background="@color/blue"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

Extected 和实际情况:

enter image description here

现在我的问题是,如果我有一个视图,为什么不能按预期工作,但是如果我添加第二个视图,形成一个水平链,第一个视图现在正在工作?app:layout_constraintDimensionRatio="H,1:1"app:layout_constraintDimensionRatio="H,1:1"

XML Android约束布局

评论


答:

0赞 C.F.G 9/24/2023 #1

表示 H8 在设置 Width 应遵循该纵横比。app:layout_constraintDimensionRatio="H,1:1"

在示例中,您已将“开始”和“结束”两边都设置为父项。所以宽度应该是数学父级。现在高度将与宽度一样多。

在第二个示例中,您限制了它的宽度。H8 将尊重该比率。

尝试更改为第一个示例,看看会发生什么。(您的高度是有限的,而不是宽度)HW

评论

0赞 pequeñaluna 9/30/2023
在第二个示例中,如果我删除两个 app:layout_constraintDimensionRatio=“H,1:1”,宽度是两个视图的屏幕的一半,那么为什么 app:layout_constraintDimensionRatio=“H,1:1” 会改变宽度,如果你说首先设置了宽度,然后高度将尊重比例?
0赞 C.F.G 9/30/2023
约束布局并不傻。如果它知道没有办法应用逻辑,它就会做唯一可能的方法。(这里的比例说应该是 1:1,但他试图让宽度尽可能大,但高度不会让他走得更远。
0赞 pequeñaluna 9/30/2023
是的,但如果这是真的,为什么在第一个示例中,即使视图的最大高度在使用 app:layout_constraintDimensionRatio=“H,1:1” 时受到准则的限制,该准则也会被忽略并且高度超过该限制?我指的是第二张图片(“到底发生了什么:”下面的那张)
0赞 C.F.G 9/30/2023
在复杂的情况下,情况变得更加复杂。在第一个示例中,左和右(用于获取宽度)是自由的父级。但在第二个示例中,每个视图的一侧被限制为父视图,但另一侧是自由的。因此,布局无法确定确切的宽度。你也创建了一个链!从头到头连接。如果未指定链样式,则默认选择“跨页样式”。
0赞 C.F.G 9/30/2023
我想知道你为什么不想遵循 CL 结构?如果要先指定宽度,请尝试限制宽度而不是高度。然后使用其他一切都是偶然的或复杂的解释。H, 1:1