如何使 ConstraintLayout 使用百分比值?

Posted

技术标签:

【中文标题】如何使 ConstraintLayout 使用百分比值?【英文标题】:How to make ConstraintLayout work with percentage values? 【发布时间】:2016-09-16 00:56:11 【问题描述】:

随着 android Studio 2.2 的 Preview 1,Google 在其支持库中发布了一个新布局:ConstraintLayout。使用 ConstraintLayout 可以更轻松地在 Android Studio 中使用设计工具,但我没有找到使用相对尺寸(如 LinearLayout 中的百分比或“权重”)的方法。有没有办法根据百分比定义约束?例如。让视图占据屏幕的 40%,在视图之间创建 20% 的边距,将视图的宽度设置为另一个视图宽度的 50%?

【问题讨论】:

ConstraintLayout 的version 1.1 添加了对宽度或高度的百分比支持。请参阅developer.android.com/reference/android/support/constraint/… 上的“百分比维度”或一些较新的答案。 最好的解决方案是使用偏差而不涉及两个复杂问题 【参考方案1】:

在这里有一个快速参考可能会很有用。

视图的放置

使用带有app:layout_constraintGuide_percent指南,如下所示:

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline"
    android:layout_
    android:layout_
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5"/>

然后您可以将此指南用作其他视图的锚点。

在可用空间允许时,将 biasapp:layout_constraintHorizontal_bias 和/或 app:layout_constraintVertical_bias 一起使用以修改视图位置

<Button
    ...
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintHorizontal_bias="0.25"
    ...
    />

视图大小

另一个基于百分比的值是元素的高度和/或宽度,app:layout_constraintHeight_percent 和/或app:layout_constraintWidth_percent

<Button
    ...
    android:layout_
    app:layout_constraintWidth_percent="0.5"
    ...
    />

【讨论】:

为什么宽度设置为 1dp? @user924 给一个 0dp 宽度的指南是有意义的,我不知道为什么实现这个的开发人员决定使用 1dp。可能是因为 0dp 在使用权重时被视为“拉伸”。 @user924: 0dp 在 ConstraintLayout 中用于指示动态调整大小。见developer.android.com/reference/android/support/constraint/… @serv-inc 但这里是1dp,而不是0dp.. 这就是我要说的 @user924:您需要将其设置为宽度。 0dp 已经被保留,所以1dp 似乎是明智的。【参考方案2】:

您目前可以通过多种方式执行此操作。

一种是创建指南(右键单击设计区域,然后单击添加垂直/水平指南)。然后,您可以单击指南的“标题”将定位更改为基于百分比。最后,您可以将视图限制为指南。

另一种方法是使用偏差(百分比)定位视图,然后将其他视图锚定到该视图。

也就是说,我们一直在考虑如何提供基于百分比的维度。我不能做出任何承诺,但这是我们想补充的。

【讨论】:

0 反对票 我可以要求跟进吗?我正在尝试将 ImageView 设置为 60% 的宽度,但保持 16:9 的纵横比。我希望宽度是固定的,但 ImageView 的高度是动态的。 ConstraintLayout 有可能吗?我正在努力让它工作 - 除非我指定硬编码尺寸,否则我最终会得到固定的宽度/高度值 0。 @MattWilliams89 有一个名为 layout_constraintDimensionRatio 的参数,我想它可能对您有用,在此处写上“16:9”。我没有成功尝试用它构建你的布局,图像变得很大 @RomainGuy 如何将定位更改为在指导线标题上的百分比?我试图右键单击它,但没有任何显示 对于那些想知道指南标题到底是什么的人,它是带有向上或向下箭头或百分比符号的圆圈。单击该按钮可在 XML 中的 app:layout_constraintGuide_begin、app:layout_constraintGuide_end 和 app:layout_constraintGuide_percent 之间切换。我遇到了一个小问题(在 ConstraintLayout 版本 1.0.0-alpha8 上,我必须单击指南,按住鼠标并拖动到圆圈以在编辑器中切换这些,但我相信这个错误很快就会得到修复. 你也可以使用app:layout_constraintGuide_percentage在布局的XML中设置这个【参考方案3】:

从“ConstraintLayout1.1.0-beta1”开始,您可以使用百分比来定义宽度和高度。

android:layout_
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".4"

这会将宽度定义为屏幕宽度的 40%。 将此与百分比指南相结合,您可以创建所需的任何基于百分比的布局。

【讨论】:

在约束布局 1.0.2 中,不支持 layout_constraintWidth_defaultpercent 值。我认为正确的方法是使用指南。 它适用于 2017 年 10 月 20 日构建的 Android Studio 3.0 如答案中所述,这是在 ConstraintLayout 的version 1.1 中添加的。稳定版不再需要额外的_default="percent"!请参阅developer.android.com/reference/android/support/constraint/… 上的“百分比维度” @hoford,对于包含文本的视图,其大小以sp 单位定义,文本大小如何与视图大小自动成比例(它本身是按比例定义的到布局的总大小,即“百分比”)? @Bliss,当视图改变它的大小时,应该以编程方式改变 textSize。【参考方案4】:

使用新版本的 ConstraintLayout v1.1,您现在可以执行以下操作:

<Button
android:layout_
android:layout_
app:layout_constraintHeight_percent="0.2"
app:layout_constraintWidth_percent="0.65" />

这会将按钮限制为父视图的 20% 高度和 65% 宽度。

【讨论】:

只有当我从“android:”更改为“app:”时才有效 -> app:layout_constraintHeight_percent="0.2" 这对我来说是遵循材料设计的流畅布局时必须的。 material.io/design/layout/… @Adam,对于包含文本的视图,其大小将以sp 为单位定义,文本大小如何与视图的大小自动成比例(它本身是按比例定义的到布局的总大小,即“百分比”)? @Bliss 听起来可能会有所帮助:developer.android.com/guide/topics/ui/look-and-feel/… 不过我自己从未使用过。【参考方案5】:

如何使用指南

接受的答案有点不清楚如何使用指南以及“标题”是什么。

步骤

首先添加一个指南。

选择参考线或稍微移动它以使约束可见。

然后单击圆形圆圈(“标题”),直到它变为百分比。然后,您可以将此百分比降低到 50% 或您想要的任何值。

之后,您可以将您的视图限制在指南中,使其成为父级的某个百分比(在视图上使用match_constraint)。

【讨论】:

“标题”应该在哪里可见?它没有出现在我的视图中。 @Marcel50506,确保设计和蓝图视图都显示。这将使您有最好的机会看到它。如果您可以看到指导线,请尝试单击以将其选中。如果您看不到这条线,请尝试单击组件树菜单中应该位于左侧的指南项(假设您已经添加了指南)。 我没有看到圆圈,但是当单击指南左侧时,我可以将其更改为百分比。我认为是渲染问题。谢谢。 这是最好的答案,因为它提出了更好的布局方法。我们可以在基本指南上对齐多个视图,而不是仅在一个视图上添加百分比【参考方案6】:

指南是无价的 - app:layout_constraintGuide_percent 是一个很好的朋友......但是有时我们想要没有指南的百分比。现在可以使用权重

android:layout_
app:layout_constraintHorizontal_weight="1"

这是一个更完整的示例,它使用带有附加权重的准则:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    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:layout_
    android:layout_
    android:padding="16dp"
    tools:context="android.itomerbu.layoutdemo.MainActivity">

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_
        android:layout_
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.44"/>

    <Button
        android:id="@+id/btnThird"
        android:layout_
        app:layout_constraintHorizontal_weight="1"
        android:layout_
        android:text="@string/btnThird"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintRight_toLeftOf="@+id/btnTwoThirds"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"/>

    <Button
        android:id="@+id/btnTwoThirds"
        app:layout_constraintHorizontal_weight="2"
        android:layout_
        android:layout_
        android:text="@string/btnTwoThirds"
        app:layout_constraintBottom_toBottomOf="@+id/btnThird"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/btnThird"/>
</android.support.constraint.ConstraintLayout>

【讨论】:

@Plumbus - 权重等同于百分比(任何百分比都可以在数学上转换为权重,反之亦然)。对术语挑剔会错过答案的重点。【参考方案7】:

Constraint Layout 1.0 使视图占据屏幕的百分比需要制定两条准则。在 Constraint Layout 1.1 中,它变得更加简单,您可以轻松地将任何视图限制为百分比宽度或高度。

这不是很棒吗?所有视图都支持 layout_constraintWidth_percent 和 layout_constraintHeight_percent 属性。这些将导致约束固定在可用空间的百分比上。因此,只需几行 XML 就可以使 Button 或 TextView 展开以填充屏幕的百分比。

例如,如果你想将按钮的宽度设置为屏幕的 70%,你可以这样做:

<Button
android:layout_
android:layout_
android:layout_constraintWidth_percent="0.7" />

请注意,由于我们在上面已将 android:layout_width 指定为 0dp,因此您必须将尺寸用作 0dp 的百分比。

同样,如果你想将按钮的高度设置为屏幕的 20%,你可以这样做:

<Button
android:layout_
android:layout_
android:layout_constraintHeight_percent="0.2" />

看!这次我们将 android:layout_height 指定为 0dp,因为我们希望按钮使用高度作为百分比。

【讨论】:

但是如何同时获得其他视图的百分比而不是父视图?【参考方案8】:

使用 ConstraintLayout v1.1.2,维度应设置为 0dp,然后将 layout_constraintWidth_percentlayout_constraintHeight_percent 属性设置为 0 和 1 之间的值,例如:

<!-- 50% width centered Button -->
<Button
    android:id="@+id/button"
    android:layout_
    android:layout_
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintWidth_percent=".5" />

(ConstraintLayout 1.1.2及以下版本无需设置app:layout_constraintWidth_default="percent"app:layout_constraintHeight_default="percent"

【讨论】:

【参考方案9】:

试试这个代码。您可以使用 app:layout_constraintHeight_percent 和 app:layout_constraintWidth_percent 更改高度和宽度百分比。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:background="#FF00FF"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHeight_percent=".6"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent=".4"></LinearLayout>

</android.support.constraint.ConstraintLayout>

分级:

dependencies 
...
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

【讨论】:

【参考方案10】:

您可以在linearlayout 中使用app:layout_constraintVertical_weightlayout_weight 相同

<android.support.constraint.ConstraintLayout
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:layout_
android:layout_>

<Button
    android:id="@+id/button4"
    android:layout_
    android:layout_
    android:text="Button"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/button5"
    app:layout_constraintVertical_weight="1"/>

<Button
    android:id="@+id/button5"
    android:layout_
    android:layout_
    android:text="Button"
    app:layout_constraintLeft_toRightOf="@+id/button4"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintVertical_weight="1"/>
</android.support.constraint.ConstraintLayout>

注意:app:layout_constraintVertical_weight(app:layout_constraintHorizontal_weight) 将与android:layout_width="0dp" (android:layout_height="0dp") 一起使用

【讨论】:

【参考方案11】:

对于可能觉得有用的人,您可以在ConstraintLayout 内的任何子视图中使用layout_constraintDimensionRatio,我们可以将高度或宽度定义为另一个维度的比率(至少一个宽度或高度必须为 0dp ) 例子

 <ImageView
        android:layout_
        android:layout_
        android:src="@drawable/top_image"
        app:layout_constraintDimensionRatio="16:9"        
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

在这种情况下,纵横比是 16:9 app:layout_constraintDimensionRatio="16:9" 你可以找到更多信息 HERE

【讨论】:

【参考方案12】:

使用指南,您可以将定位更改为基于百分比

<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_
android:layout_
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"/>

你也可以这样用

android:layout_
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.4"

【讨论】:

【参考方案13】:

我知道这不是 OP 最初要求的,但是当我遇到类似问题时,这在这种情况下帮助了我很多。为希望更改布局窗口大小的人添加这个(我经常使用) ,通过代码。在问题活动中将此添加到您的 onCreate 中。 (将其更改为 80%)

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

int width = dm.widthPixels;
int height = dm.heightPixels;

getWindow().setLayout((int)(width * 0.8), (int)(height * 0.8));

【讨论】:

【参考方案14】:

只需在您的指南标签中替换 , 即可

app:layout_constraintGuide_begin="291dp"

app:layout_constraintGuide_percent="0.7"

其中 0.7 表示 70%。

此外,如果您现在尝试拖动参考线,拖动的值现在将以 %age 显示。

【讨论】:

以上是关于如何使 ConstraintLayout 使用百分比值?的主要内容,如果未能解决你的问题,请参考以下文章

ConstraintLayout系列:设置高度百分比

Android ConstraintLayout 约束布局 Width 0dp constrainedWidth 百分比布局使用

如何使 ConstraintLayout 中的元素居中

ConstraintLayout:如何以编程方式将屏幕划分为屏幕高度的两个相等部分

ConstraintLayout利用百分比属性来解决一些简单的适配问题

Android 屏幕适配屏幕适配通用解决方案 ⑥ ( 约束布局 ConstraintLayout 百分比布局方案 | 将设计稿尺寸自动转为约束布局百分比标签属性 | 将输出结果设置到组件标签中 )