如何使 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"/>
然后您可以将此指南用作其他视图的锚点。
或
在可用空间允许时,将 bias 与 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_
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_default 的 percent 值。我认为正确的方法是使用指南。 它适用于 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_percent
或 layout_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_weight
与layout_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 使用百分比值?的主要内容,如果未能解决你的问题,请参考以下文章
Android ConstraintLayout 约束布局 Width 0dp constrainedWidth 百分比布局使用
ConstraintLayout:如何以编程方式将屏幕划分为屏幕高度的两个相等部分
ConstraintLayout利用百分比属性来解决一些简单的适配问题
Android 屏幕适配屏幕适配通用解决方案 ⑥ ( 约束布局 ConstraintLayout 百分比布局方案 | 将设计稿尺寸自动转为约束布局百分比标签属性 | 将输出结果设置到组件标签中 )