如何使ConstraintLayout使用百分比值?


207

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


3
version 1.1ConstraintLayout 中添加了对宽度或高度的百分比支持。请参阅developer.android.com/reference/android/support/constraint/…上的“百分比尺寸”或一些较新的答案。
sunadorer

Answers:


225

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

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

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

也就是说,我们一直在考虑如何提供基于百分比的尺寸。我无法做出任何承诺,但这是我们要补充的内容。


1
0张否决票我可以要求跟进吗?我正在尝试将ImageView设置为60%的宽度,但保持16:9的宽高比。我希望宽度是固定的,但是ImageView的高度是动态的。使用ConstraintLayout可以做到吗?我一直在努力使其无法正常工作-除非指定硬编码尺寸,否则最终会得到固定的宽度/高度值为0。
MattWilliams16年

3
@ MattWilliams89有一个名为layout_constraintDimensionRatio的参数,我想它可能对您有用,在该处写“ 16:9”。但是我没有成功尝试用它来构建布局,图像变得很大
Yury Fedorov

1
@RomainGuy如何更改在标头上的位置的百分比?我尝试右键单击它,但没有任何显示
Edijae Crusar

21
对于那些想知道指南标题是什么的人,是带有向上或向下箭头或百分比符号的圆圈。单击可在XML中的app:layout_constraintGuide_begin,app:layout_constraintGuide_end和app:layout_constraintGuide_percent之间切换。我遇到了一个小问题(在ConstraintLayout版本1.0.0-alpha8上,我必须单击该准则,按住鼠标,然后拖动到圆圈中以在编辑器中切换这些准则,但是我确定此错误会很快得到解决。 。
勒斯蒂格

4
您也可以使用app:layout_constraintGuide_percentage
piratemurray

215

在此处快速参考可能会很有用。

视图的位置

使用指南app:layout_constraintGuide_percent这样的:

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

然后,您可以将该准则用作其他视图的锚点。

要么

使用偏差app: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_width="0dp"
    app:layout_constraintWidth_percent="0.5"
    ...
    />

3
为什么将宽度设置为1dp?
user924

1
@ user924给出一个宽度为0dp的准则是合理的,我不知道为什么实施此准则的开发人员决定采用1dp。可能是因为使用权重时0dp被视为“伸展”。
阿米尔·乌瓦尔

3
@ user924:0dp在ConstraintLayout中用于指示动态大小。见developer.android.com/reference/android/support/constraint/...
SERV-INC

1
@ serv-inc,但这里1dp不是0dp,这是我在说的
user924

3
@ user924:您需要将其设置为宽度。0dp已被保留,因此1dp似乎很明智。
serv-inc

109

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

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".4"

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


6
在约束布局1.0.2中,不支持layout_constraintWidth_default百分比值。我认为正确的方法是使用准则。
vovahost

1
它可以与2017
douarbou

5
如答案中所述,这是在version 1.1ConstraintLayout 中添加的。_default="percent"稳定版本不再需要其他功能!请参阅developer.android.com/reference/android/support/constraint/…上的“百分比尺寸”
sunadorer

@hoford,对于包含文本(其大小将以sp单位定义)的View ,如何将text-size与视图的大小自动成比例(其本身与布局的总大小成比例,即以“百分比”定义) ?
布利斯

77

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

<Button
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintHeight_percent="0.2"
app:layout_constraintWidth_percent="0.65" />

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


1
对我来说,只有当我从“ android:”更改为“ app:”-> app:layout_constraintHeight_percent =“ 0.2”时,我的工作才有效
Kirill Karmazin

在遵循材料设计的流畅布局时,这对我来说是必须的。material.io/design/layout/…–

@Adam,对于包含文本的视图(其大小将以sp单位定义),文本大小如何与视图的大小自动成比例(其本身与布局的总大小成比例定义,即以“百分比”表示) ?
布利斯

1
@Bliss像这样的声音可能会有所帮助:developer.android.com/guide/topics/ui/look-and-feel / ...虽然我自己从未使用过它。
亚当

43

如何使用指南

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

脚步

首先添加准则。

在此处输入图片说明

选择“指导线”或将其稍微移动以使约束可见。

在此处输入图片说明

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

在此处输入图片说明

之后,您可以将视图约束到“准则”以使其占父match_constraint视图的某个百分比(在视图上使用)。

在此处输入图片说明


“标头”在哪里可见?在我看来,它没有显示。
Marcel50506 '17

@ Marcel50506,确保同时显示“设计”和“蓝图”视图。这将为您提供最大的机会来查看它。如果可以看到准则行,请尝试单击它以将其选中。如果看不到该行,请尝试在“组件树”菜单中单击应该位于左侧的准则项(假设您已经添加了准则)。
Suragch '17

1
我看不到圆圈,但是当单击指南的左侧时,我可以将其更改为百分比。谢谢。
Marcel50506 '17

这是最好的答案,因为它提出了更好的布局方法。我们可以在基本准则上对齐多个视图,而不是仅在一个视图上增加百分比
Nguyen Minh Hien

33

该准则非常宝贵-app:layout_constraintGuide_percent是一个很好的朋友...但是有时候我们想要没有准则的百分比。现在可以使用权重

android:layout_width="0dp"
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_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context="android.itomerbu.layoutdemo.MainActivity">

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

    <Button
        android:id="@+id/btnThird"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        android:layout_height="wrap_content"
        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_width="0dp"
        android:layout_height="wrap_content"
        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>

2
@Plumbus-权重等于百分比(可以将任何百分比从数学上转换为权重,反之亦然)。由于对术语一无所知,您错过了答案的重点。
Scott Biggs

11

对于ConstraintLayout v1.1.2,应将尺寸设置为0dp,然后将layout_constraintWidth_percentlayout_constraintHeight_percent属性设置为介于0和1之间的值,例如:

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

(您不需要设置app:layout_constraintWidth_default="percent"app:layout_constraintHeight_default="percent"使用ConstraintLayout 1.1.2及以下版本)


10

使用Constraint Layout 1.0制作视图时,需要占用两个屏幕的一定比例的屏幕。在“约束布局1.1”中,它使您可以轻松地将任何视图约束为一定百分比的宽度或高度,从而使其变得更加简单。

在此处输入图片说明

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

例如,如果要将按钮的宽度设置为屏幕的70%,则可以这样操作:

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_constraintWidth_percent="0.7" />

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

同样,如果要将按钮的高度设置为屏幕的20%,则可以执行以下操作:

<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_constraintHeight_percent="0.2" />

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


8

试试这个代码。您可以使用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_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="0dp"
        android:layout_height="0dp"
        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'
}

在此处输入图片说明


7

你可以使用app:layout_constraintVertical_weight它作为同layout_weightlinearlayout

<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_width="match_parent"
android:layout_height="match_parent">

<Button
    android:id="@+id/button4"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    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_width="0dp"
    android:layout_height="wrap_content"
    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_weightapp:layout_constraintHorizontal_weight)会与android:layout_width="0dp"android:layout_height="0dp"


5

对于可能会有用的人,您可以在中使用layout_constraintDimensionRatio任何子视图ConstraintLayout,我们可以定义Height或Width与其他尺寸的比率(至少一个宽度或高度必须为0dp)示例

 <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        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" 您可以在此处找到更多信息


3

我知道这不是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));

2

只需在准则标签中替换即可

app:layout_constraintGuide_begin="291dp"

app:layout_constraintGuide_percent="0.7"

其中0.7表示70%。

另外,如果您现在尝试拖动辅助线,则所拖动的值现在将以百分比显示。


2

使用准则,您可以将排名更改为基于百分比

<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"/>

您也可以使用这种方式

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.4"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.