首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ConstraintLayout 1.1.0 (beta)中链中的利润率是如何工作的?

在ConstraintLayout 1.1.0 (beta)中链中的利润率是如何工作的?
EN

Stack Overflow用户
提问于 2017-12-21 19:18:02
回答 3查看 14.1K关注 0票数 18

自从切换到ConstraintLayout版本1.1.0-beta4之后,我的一些布局就被炸掉了。在进行任何更改之前,我希望更好地了解ConstraintLayout链中的利润率是如何工作的。在下面的文章中,我比较了ConstraintLayout版本1.0.2和版本1.1.0-beta4中的布局,但是我相信这个问题首先出现在1.1.0beta2中。

我的目标是让一些文本视图延伸到屏幕上,在第1和第2文本视图以及第2和第3文本视图之间存在空白。背景应显示在这些空白处。为此,我创建了一个水平链,并指定了从左侧文本视图到中心文本视图的结束边距,以及从中间文本视图到右侧文本视图的结束边距。水平链样式是spread_inside

示例1-使用ConstraintLayout版本1.0.2

这就是1.0.2版中的情况,也是我所期望的。

代码语言:javascript
运行
复制
<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@android:color/holo_blue_light">

    <TextView
        android:id="@+id/tvLeft"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:layout_marginEnd="8dp"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Text1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tvCenter"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="HardcodedText" />

    <TextView
        android:id="@+id/tvCenter"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:layout_marginEnd="8dp"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Text2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tvRight"
        app:layout_constraintStart_toEndOf="@+id/tvLeft"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="HardcodedText" />

    <TextView
        android:id="@+id/tvRight"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Text3"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/tvCenter"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="HardcodedText" />

</android.support.constraint.ConstraintLayout>

示例2-使用ConstraintLayout版本1.1.0-beta4 4

这个布局类似于ConstraintLayout版本1.1.0-beta4中的如下所示。请注意,空白处已经消失。我希望这看起来应该和示例1一样,但事实并非如此。

示例3--使用ConstraintLayout版本1.1.0-beta4 4并具有起始裕度

如果我采用相同的布局,只需向右侧文本视图( 8dp )添加一个开始边距(tvRight),那么我的页边距不仅在中间文本视图和右侧文本视图之间,而且在左文本视图和中间文本视图之间重新出现,尽管我没有在那里更改页边距。

这不仅仅是先前设定的利润率突然被授予的结果。如果我将最右边文本视图的开始边距设置为'48dp',那么在左文本视图和中间文本视图之间也会出现一个48dp边距。

代码语言:javascript
运行
复制
<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@android:color/holo_blue_light">

<!-- TextViews tvLeft & tvRight not shown but are the same as above.-->

<TextView
    android:id="@+id/tvRight"
    android:layout_width="0dp"
    android:layout_height="35dp"
    android:layout_marginStart="48dp"
    android:background="@android:color/white"
    android:gravity="center"
    android:text="Text3"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/tvCenter"
    app:layout_constraintTop_toTopOf="parent"
    tools:ignore="HardcodedText" />

</android.support.constraint.ConstraintLayout>  

所以,我的问题是,“为什么我看到这些结果?”如何在ConstraintLayout链中处理利润率,特别是spread_inside链?处理链边距的方式是否发生了变化,还是我遗漏了什么?我正在寻找一个解释或参考一些文件,解释所有这一切。

EN

Stack Overflow用户

回答已采纳

发布于 2018-01-04 20:42:43

我找不到任何文件能给出这个问题的权威答案。然而,在ConstraintLayout中有一些关于边距的讨论。

如果设置了边边距,则它们将应用于相应的约束(如果存在)。

在链的特定实例中,每个视图之间都有双向约束。也就是说,不仅视图A的结束被限制为查看B的开始,而且视图B的开始也被限制到视图A的结束。

在您发布的布局中,View A有结束约束和结束边距,但是View B有一个开始约束,没有开始边距。据我所知,这意味着您的布局中有冲突的规则(视图A希望8dp远离视图B,而视图B希望从视图A变为0dp )。也许不同版本的ConstraintLayout库具有不同的策略,用于(a)确定这是否算是冲突,(b)解决冲突。

通过实验,下面是我如何在不同的ConstraintLayout库版本上找到在链中工作的边距:

1.0.2版

链中每个视图的边距不依赖于或影响链中的其他视图。这至少对行为有两个明显的影响。首先,向一个视图添加保证金会将另一个视图推开,而不管该视图的边距如何。第二,向一个视图添加边距不会影响更深层次的视图边距(例如,在第一个视图上添加8dp结束边距本身并不会导致8dp值的空间出现在第二个视图和第三个视图之间)。

版本1.1.0-beta4 4

链中每个视图的边距都取决于并影响到链中的其他视图。同样,这对行为有两个明显的影响。首先,向一个视图添加页边距不会将另一个视图推开,除非它也有相同数量的保证金*。第二,在链的第一视图和第二视图之间添加空白也将影响链的第二视图和第三视图之间的间距**。

*:似乎1.1.0-beta4 4只允许一个开始边距将视图分开,而仅仅一个结束边距就不会产生任何影响。无论如何,我建议与边距匹配。

**:我怀疑这是因为连锁店试图平均分配“空间”。视图A和B之间的边距造成了空白,由于链希望强制执行一致的间距,所以在视图B和视图C之间增加了类似的间隔。

示例:

剥离的方式,这是一个布局,就像你的原版,边距略有变化。我把其他属性都保留不变了。

代码语言:javascript
运行
复制
<android.support.constraint.ConstraintLayout>

    <TextView
        android:layout_marginEnd="8dp"/>

    <TextView
        android:layout_marginStart="8dp"/>

    <TextView/>

</android.support.constraint.ConstraintLayout>

v1.0.2:

v1.1.0-beta4:

这应该说明库版本之间的两个不同之处。同样,我一直无法找到解释所有这些的官方文档,但仅仅基于实验,这似乎是正确的。

票数 13
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47931430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档