提问人:pequeñaluna 提问时间:9/23/2023 更新时间:9/24/2023 访问量:25
layout_constraintDimensionRatio的意外行为
Unexpected behavior of layout_constraintDimensionRatio
问:
据我所知,如果我在一个元素中使用,该元素的高度将是固定的,然后宽度将适应与宽度相同的大小,但在以下示例中,高度不是固定的。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>
我期望发生的事情:
真实情况:
奇怪的事实
如果我在我拥有的视图旁边添加另一个具有相同视图的视图(形成两个视图的水平链),它现在神秘地按预期工作。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 和实际情况:
现在我的问题是,如果我有一个视图,为什么不能按预期工作,但是如果我添加第二个视图,形成一个水平链,第一个视图现在正在工作?app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintDimensionRatio="H,1:1"
答:
0赞
C.F.G
9/24/2023
#1
表示 H8 在设置 Width 后应遵循该纵横比。app:layout_constraintDimensionRatio="H,1:1"
在示例中,您已将“开始”和“结束”两边都设置为父项。所以宽度应该是数学父级。现在高度将与宽度一样多。
在第二个示例中,您限制了它的宽度。H8 将尊重该比率。
尝试更改为第一个示例,看看会发生什么。(您的高度是有限的,而不是宽度)H
W
评论
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
评论