添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何使ConstraintLayout与百分比值一起工作?

304 人关注

随着Android Studio 2.2预览版的推出,谷歌在其支持库中发布了一个新的布局。 ConstraintLayout .有了ConstraintLayout,使用Android Studio中的设计工具就更容易了,但我没有找到使用相对尺寸的方法(像LinearLayout中的百分比或 "权重")。有没有一种方法可以基于百分比来定义约束?例如,让一个视图占屏幕的40%,在视图之间创建20%的空白,将一个视图的宽度设置为另一个视图的宽度的50%?

2 个评论
ConstraintLayout的 version 1.1 中增加了对宽度或高度的百分比支持。见 "Percent dimension" on developer.android.com/reference/android/support/constraint/... 或一些较新的答案。
最好的解决方案是使用偏压法,而不需要太多复杂的东西。
android
android-support-library
android-constraintlayout
Yury Fedorov
Yury Fedorov
发布于 2016-05-19
14 个回答
Amir Uval
Amir Uval
发布于 2018-02-28
已采纳
0 人赞同

在这里有一个快速参考可能是有用的。

Placement of views

使用一个 guideline with app:layout_constraintGuide_percent like this:

<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"/>

然后你可以用这个准则作为其他观点的锚点。

Use 偏见在可用空间允许的情况下,用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"

Size of views

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

<Button
    android:layout_width="0dp"
    app:layout_constraintWidth_percent="0.5"

一个有用的补充是相对于第一个维度设置其他维度,例如 - 根据宽度按比例设置高度。

  app:layout_constraintDimensionRatio="1:1"
    
为什么它的宽度被设置为1dp?
@user924 给出一个0dp的宽度的准则是有意义的,我不知道为什么实施这个的开发者决定用1dp。也许是因为0dp在使用权重时被认为是 "拉伸"。
@user924:替换代码0】在ConstraintLayout中被用来表示动态尺寸。见 developer.android.com/reference/android/support/constraint/...
@serv-inc 但这里是 1dp ,而不是 0dp ......这就是我所说的。
@user924:你需要把它设置成一个宽度。 0dp 已经被保留了,所以 1dp 似乎是合理的。
Romain Guy
Romain Guy
发布于 2018-02-28
0 人赞同

目前,你可以通过几种方式做到这一点。

一个是创建准则(右击设计区,然后点击添加垂直/水平准则)。然后你可以点击准则的 "头 "来改变定位为基于百分比。最后,你可以将视图限制在准则上。

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

这就是说,我们一直在考虑如何提供基于百分比的尺寸。我不能做出任何承诺,但这是我们想增加的东西。

0次投票 我可以问一下后续问题吗?我想把一个ImageView设置成60%的宽度,但保持16:9的长宽比。我希望宽度是固定的,但ImageView的高度是动态的。用ConstraintLayout能做到吗?我很难做到这一点--除非我指定硬编码的尺寸,否则我最终得到的固定宽度/高度值是0。
@MattWilliams89 有一个参数叫 layout_constraintDimensionRatio,我想它对你的情况可能有用,在那里写上 "16:9"。但我没有成功地尝试用它来构建你的布局,图像变得很大。
@RomainGuy 你是如何将定位改为以百分比表示的 guidlines 的标题的?
对于那些想知道准则的标题是什么的人来说,它是一个带有向上或向下箭头或百分比符号的圆圈。点击它可以在XML中的app:layout_constraintGuide_begin、app:layout_constraintGuide_end和app:layout_constraintGuide_percent之间切换。我遇到了一个小问题(在ConstraintLayout 1.0.0-alpha8版本上,我必须点击准则,按住鼠标,然后拖动到圆圈上才能在编辑器中切换这些,但我相信这个错误很快就会被修复。
你也可以在布局的XML中使用 app:layout_constraintGuide_percentage 来设置。
hoford
hoford
发布于 2018-02-28
0 人赞同

As of "ConstraintLayout1.1.0-beta1" you can use percent to define widths & heights.

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

这将定义宽度为屏幕宽度的40%。 结合这一点和以百分比为单位的准则,你可以创建任何你想要的基于百分比的布局。

在约束性布局1.0.2中。 percent 价值为 layout_constraintWidth_default 是不支持的。我认为正确的方法是使用《指南》。
它与2017年10月20日建立的Android Studio 3.0一起工作。
正如答案中所说,这是在ConstraintLayout的 version 1.1 中添加的。额外的 _default="percent" 在稳定版中已经不需要了。请看 "Percent dimension" on developer.android.com/reference/android/support/constraint/...
@hoford,对于一个包含文本的视图,其大小是以 sp 为单位定义的,文本的大小如何能与视图的大小自动成比例(其本身是以布局的总大小为比例定义的,也就是以'百分比'为单位)?
@Bliss, textSize应该在视图改变大小时以编程方式改变。
Adam
Adam
发布于 2018-02-28
0 人赞同

通过新发布的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%。

for me worked only when I changed from "android:" to "app:" -> app:layout_constraintHeight_percent="0.2"
在遵循材料设计的流畅布局时,这对我来说是必须的。 material.io/design/layout/...
@Adam,对于一个包含文本的视图,其大小是以 sp 为单位定义的,文本大小如何能与视图的大小自动成比例(其本身是以布局的总大小为比例定义的,即以 "百分比 "为单位)?
Adam
@Bliss Sounds like this could help: developer.android.com/guide/topics/ui/look-and-feel/... 不过我自己从来没有用过它。
Suragch
Suragch
发布于 2018-02-28
0 人赞同

How to use Guidelines

公认的答案对如何使用指南和什么是 "头 "有点不清楚。

Steps

首先添加一个指导原则。

选择指导线或稍稍移动它,使约束条件可见。

然后点击圆圈("头"),直到它变成一个百分比。然后你可以将这个百分比向下拖动到50%或任何你想要的地方。

之后,你可以将你的视图约束到指导线上,使其成为父体的某个百分比(在视图上使用 match_constraint )。

头部 "应该在哪里可见?它在我的视图中没有显示出来。
@Marcel50506,确保设计和蓝图视图都显示出来。这将给你最好的机会能够看到它。如果你能看到指导线,试着点击它来选择它。如果你看不到那条线,那么试着点击组件树菜单中的指导线项目,它应该在左边(假设你已经添加了指导线)。
我没有看到圆圈,但是当点击准则的左边时,我可以把它改成百分比。我认为是渲染问题。谢谢你。
这是最好的答案,因为它提出了更好的布局方法。我们可以在基线上对齐多个视图,而不是只在一个视图上增加百分比。
0 人赞同

准则是非常宝贵的--app:layout_constraintGuide_percent是一个伟大的朋友......然而,有时我们想要的是没有准则的百分比。现在,我们可以使用 weights :

android:layout_width="0dp"
app:layout_constraintHorizontal_weight="1"

下面是一个更完整的例子,它使用了一个带有附加的准则weights:

<?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>
    
@Plumbus - 重量等同于百分比(任何百分比都可以在数学上转换为重量,反之亦然)。 通过对术语的吹毛求疵,你错过了答案的重点。
Ashish Satpute
Ashish Satpute
发布于 2018-02-28
0 人赞同

Constraint Layout 1.0使一个视图占屏幕的百分比需要制定两个准则。在Constraint Layout 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。

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

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

看!这次我们把android:layout_height指定为0dp,因为我们想让按钮使用百分比的高度。

但如何使其他视图的百分比而不是父视图的百分比?
Bubu
Bubu
发布于 2018-02-28
0 人赞同

在ConstraintLayout v1.1.2中,应该将维度设置为 0dp ,然后将 layout_constraintWidth_percent layout_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" />

(在ConstraintLayout 1.1.2及以下版本中,你不需要设置app:layout_constraintWidth_default="percent"app:layout_constraintHeight_default="percent")

live-love
live-love
发布于 2018-02-28
0 人赞同

试试这段代码。你可以用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>

Gradle。

dependencies {
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    
vuhung3990
vuhung3990
发布于 2018-02-28
0 人赞同

you can use app:layout_constraintVertical_weight it same as layout_weight in linearlayout

<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>

NOTE: app:layout_constraintVertical_weight(app:layout_constraintHorizontal_weight) will work with android:layout_width="0dp" (android:layout_height="0dp"

Javier
Javier
发布于 2018-02-28
0 人赞同

对于那些可能觉得有用的人来说,你可以使用 layout_constraintDimensionRatio 在一个 ConstraintLayout 里面的任何子视图,我们可以定义高度或宽度为其他尺寸的比例(至少有一个必须是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" 你可以找到更多信息HERE

Ashish Satpute
Ashish Satpute
发布于 2018-02-28
0 人赞同

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

<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"
    
ProgAz
ProgAz
发布于 2018-02-28
0 人赞同

我知道这不是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));
    
Udit Kapahi
Udit Kapahi
发布于 2018-02-28
0 人赞同

很简单,只需在你的准则标签中替换掉 ,即可。

app:layout_constraintGuide_begin="291dp"
app:layout_constraintGuide_percent="0.7"