constraint layout(ConstraintLayout约束布局的坑)
本文目录
- ConstraintLayout约束布局的坑
- Android-ConstraintLayout约束布局使用
- 五、ConstraintLayout(约束布局)布局介绍
- 约束布局ConstraintLayout使用详解
- Android-ConstraintLayout(约束布局)-Centering/Circular and with Bias了解一下
- ConstraintLayout使用
- Android 新控件之ConstraintLayout(约束布局)
- ConstraintLayout布局使用方法
- layout_marginEnd在constraintLayout中无效解决
- android studio约束布局 如何制作阵列
ConstraintLayout约束布局的坑
约桐昌饥束布局需要把控件的上下左右都有约束,否则有可能超出界面显示 比如textview。宽设置局返为wrapcontent,从左边开始显示,迅宴左上下都有约束,右边没有,当文字显示的多时会超出屏幕显示,此时宽为0dp即可 遇到自定义FlowLayout extend ViewGroup,这些方法都不管用,最后在FlowLayout外面加一个LinearLayout
Android-ConstraintLayout约束布局使用
这里分别以:app:layout_constraintLeft_toLeftOf和app:layout_constraintRight_toLeftOf举例: 定义两个控件:
这里的id为where的耐或TextView就使用了app:layout_constraintLeft_toLeftOf相对于另一个TextView,这个时候id为where的TextView的显示的位置,其实是左边贴在了id为right_top的TextView的左边上。如下图:
这个时候如果将id为where的相对于id为right_top的修改成app:layout_constraintRight_toLeftOf,如下所示:
那么此时显示的样式,就是id为where的TextView相对于id为right_top的TextView的右边显示。如昌凳伍下图:
这个属性,是让A和B两个控件的基准线在同一个水平位置上,比如两个TextView,大小不同,字体的大小也不同,那么想要让这样两个不同大小不同字体大小的文本内容显示在同一个基线,则可以使用该属性。app:layout_constraintBaseline_toBaselineOf
在约束布局中,margin控制需要存在约束关系的才会生效,比如控件A某条边相对于控件B的某条边存在约束关系,则控件A与B之间的margin才会生效。
这里使用了两种margin属性,一种就是app:layout_goneMarginEnd,这个只在right_top被gone的时候生效;一种就是android:layout_marginEnd,任何时候都生效。 但是这里的margin需要生效,只有id为where的TextView被id为right_top的TextView所约束,那么id为where的TextView的margin相对于id为right_top的TextView的才生效。而id为right_top的TextView并没有被id为where的TextView约束,所以id为right_top的TextView的margin_start其实看不到生效。这里其实可以认为right_top的margin_start生效了,只不过是相对于parent的左边,但是因为right_top在parent的右上角粗橘,所以看不到这个margin效果
这两个属性单独使用并不能生效,水平方向的必须要给控件的左右两边都添加约束才会生效,垂直方向的必须要给控件的上下两边都添加约束才可以生效。
比如这个例子,Button的左边被TextView的右边约束,Button的右边被parent约束,这样Button的左右两边都有约束,那么给Button添加水平方向的bias属性就可以生效,即根据Button的左边约束偏移一定的比例,这里就是相对于TextView的右边位置偏移40%。 bias的偏移,是根据控件的水平或者垂直方向的剩余位置的百分比来偏移。
如果是在ConstraintLayout中居中,则:
如果是在两个控件的中间,则可以:
设置宽高百分比,首先设置app:layout_constraintHeight_default="percent"采用百分比形式,其次使用app:layout_constraintHeight_percent="0.3"设置一个0-1的百分比值,最后控件的宽高需要设置为 0dp ,只有宽高是设置为 0dp 的,百分比才生效。
在约束布局中,给控件的左右两边或者上下两边添加约束之后,给控件的宽高设置为0dp的时候,可以占满两个约束控件中间所有剩余空间。
比如这个布局,我们需要EditText在TextView的右边,如果不给EditText设置0dp的宽度,而是设置了match_parent的话,则会占满屏幕宽度,没办法实现EditText在TextView的右边
在ConstraintLayout中给控件设置min的宽度和高度,必须是要控件的layout_width或者layout_height为wrap_content或者0dp时。给控件设置max的宽度或者高度的时候,必须是要控件的layout_width或者layout_height为0dp时。 不过在设置max的时候需要注意一点,如果单纯只是设置了0dp,如果没给控件添加对应的左右约束或者上下约束,比如没有设置左右约束,那么layout_constraintWidth_max设置的再大也不会超过整个控件的wrap_content的长度。
这里的绿色区域的控件,宽度显示的明显没有达到550dp,但是也不会继续变长了。 如果是设置了左右约束,那么最大宽度的限制也就是左右两个约束中间的剩余空间宽度
同时给Guide设置layout_constraintGuide_percent和layout_constraintGuide_begin的时候,layout_constraintGuide_begin并不会生效。 layout_constraintGuide_begin是给Guide设置相对于开始位置的偏移,layout_constraintGuide_end是给Guide设置相对于结束位置的偏移。 layout_constraintGuide_percent是设置Guide设置相对于起始位置的偏移百分比。 Guide的作用就是为了给控件的提供一个约束参考线,控件可以依靠这个线条约束。
app:constraint_referenced_ids这里是添加约束的控件的id,app:barrierDirection是添加约束的位置,可以有end、start、left、right、top、bottom 添加不同的值,就可以让Barrier线条在约束的控件的对应位置上,比如end,就是让Barrier线条在username1和password1这两个控件的右边结束位置
这两个都是线条,都是辅助约束的,但是这两个有一点区别,就是当控件比如出现切换手机语言,而造成控件上的文本显示长度出现变化的时候,Guideline并不会随着控件的长度变化而变化,这样就会造成约束不灵活,而Barrier可以根据控件的宽高变化,灵活移动位置。 所以控件宽高是随着内容动态变化的,建议使用Barrier,如果控件的内容是不变的,可以使用Guideline。
五、ConstraintLayout(约束布局)布局介绍
参考: ConstraintLayout官方文档
目前可以使用各种类型的约束:
1.相对定位 2.边缘 3.定心定位 4.圆形定位 5.可见性行为 6.尺寸限制 7.链 8.虚拟助手对象 9.优化器
注意,约束中不能具有循环依赖关系。
相对定位是在约束布局中创建布局的基本构建块之一。这些约束允许您将给定的小部件相对于另一个小部件定位。可以在水平和垂直轴上约束小部件:
1.水平轴:左、右、起点和终点 2.垂直轴:顶部、底部和文本基线
一般的概念是将控件的给定边约束到任何其他窗口小部件的另一边。 例如,为了将按钮B定位到按钮A的右边:
这告森返诉系统,我们希望按钮B的左侧被约束到按钮A的右侧。这样的位置约束意味着系统将试图使双方共享相同的位置。
以下是可用约束的列表:
他们都引用了id对于另一个小部件,或父母(它将引用父容器,即约束布局):
如果设置了边距,则它们将应用于相应的约束(如果存在),将边距强制为目标和源边之间的空间。 通常的布局边距属性可用于此效果:
当位此空饥置约束目标的可见性为View.GONE时,您还可以使用以下属性指示要使用的不同边距值:
ConstraintLayout是如何处理“不可能”的约束。例如,如果我们有这样的事情:
除非ConstraintLayout恰好具有与Button完全相同的大小,否则两个约束不能同时满足(双方都不能成为我们希望它们的位置)。
在这种情况下发生的事情是,约束的作用就像是相反的力量将小部件拉平; 这样小部件最终将在父容器中居中。 这同样适用于垂直约束。
遇到这种相反的约束时的默认设置是使窗口小部件居中; 但是您可以使用偏差属性调整定位以支持一侧而不是另一侧:
例如,以下将使左侧具有30%的偏差而不是默认的50%,使得左侧将更短,小部件更倾向于左侧:
使用偏差,您可以制作更好地适应屏幕尺寸变化的用户界面。
你可以以角度和距离约束窗口小部件中心相对于另一个窗口小部件中心。 这允许你将小部件放在圆上。 可以使用以下属性:
像往常一样,GONE小部件不会显示,也不是布局本身的一部分(即如果标亏圆记为GONE,它们的实际尺寸将不会更改)。
对于布局传递,它们的尺寸将被视为零(基本上,它们将被解析为一个点) 如果他们对其他小部件有限制,他们仍然会受到尊重,但任何边距都会好像等于零
这种特定的行为允许构建布局,你可以临时标记小部件。GONE,不破坏布局,这在做简单布局动画时特别有用。
约束布局的最小尺寸 你可以为ConstraintLayout本身定义最大和最小大小:
当其尺寸设置为WRAP_CONTENT时,ConstraintLayout将使用这些最小和最大尺寸。
可以通过以3种不同的方式设置android:layout_width和android:layout_height属性来指定控件的大小: 1.使用特定值 2.使用WRAP_CONTENT,它将要求小部件计算其自身大小。 3.使用0dp,相当于“MATCH_CONSTRAINT”
前两个以与其他布局类似的方式工作。 最后一个将以匹配所设置的约束的方式调整窗口小部件的大小((a)是wrap_content,(b)是0dp)。 如果设置了边距,则在计算中将考虑它们((c)中的0dp)。
如果维度设置为WRAP_CONTENT,则在1.1之前的版本中,它们将被视为文字维度 - 这意味着约束不会限制生成的维度。 虽然通常这足够(并且更快),但在某些情况下,您可能希望使用WRAP_CONTENT,但仍然强制执行约束以限制结果维度。 在这种情况下,您可以添加一个相应的属性:
当维度设置为MATCH_CONSTRAINT时,默认行为是使结果大小占用所有可用空间。 还有几个额外的修饰符: layout_constraintWidth_min和layout_constraintHeight_min:将设置此维度的最小大小 layout_constraintWidth_max和layout_constraintHeight_max:将设置此维度的最大大小 layout_constraintWidth_percent和layout_constraintHeight_percent:将此维度的大小设置为父级的百分比
为min和max指示的值可以是Dp中的维度,也可以是“wrap”,它将使用与WRAP_CONTENT相同的值。
要使用百分比,您需要设置以下内容: 1.尺寸应设置为MATCH_CONSTRAINT(0dp) 2.默认值应设置为app app:layout_constraintWidth_default =“percent”或app:layout_constraintHeight_default =“percent” 3.然后将layout_constraintWidth_percent或layout_constraintHeight_percent属性设置为0到1之间的值
您还可以将窗口小部件的一个维度定义为另一个维度的比率。 为此,您需要将至少一个约束维度设置为0dp(即MATCH_CONSTRAINT),并将属性layout_constraintDimensionRatio设置为给定比率。 例如:
将按钮的高度设置为与其宽度相同。
该比率可表示为: 浮点值,表示宽度和高度之间的比率 “宽度:高度”形式的比率
如果两个尺寸都设置为MATCH_CONSTRAINT(0dp),您也可以使用比率。 在这种情况下,系统设置满足所有约束的最大尺寸并保持指定的纵横比。 要根据另一个的尺寸约束一个特定边,可以预先附加W,“或H,分别约束宽度或高度。例如,如果一个维度受两个目标约束(例如,宽度为0dp并且以父对象为中心) 你可以通过在比率前添加字母W(用于约束宽度)或H(用于约束高度)来指示哪一边应该被约束,用逗号分隔:
将按照16:9的比例设置按钮的高度,而按钮的宽度将匹配父项的约束
链在单轴(水平或垂直)上提供类似组的行为。另一个轴可以独立地约束。
一组小部件被认为是一个链,如果它们通过双向连接被连接在一起(参见图,显示最小链,带有两个小部件)。
链由链的第一个元素(链的“头”)所设定的属性控制:
头部是水平链最左边的小部件,也是垂直链最顶端的小部件。
如果在连接上指定了边距,则会考虑它们。 在扩散链的情况下,将从分配的空间中扣除边距。
在链的第一个元素上设置属性layout_constraintHorizontal_chainStyle或layout_constraintVertical_chainStyle时,链的行为将根据指定的样式更改(默认为CHAIN_SPREAD)。
1.CHAIN_SPREAD - 元素将展开(默认样式) 加权链 - 在CHAIN_SPREAD模式下,如果某些小部件设置为2.MATCH_CONSTRAINT,它们将拆分可用空间 3.CHAIN_SPREAD_INSIDE - 类似,但链的端点不会分散 4.CHAIN_PACKED - 链的元素将被打包在一起。 然后,子项的水平或垂直偏差属性将影响打包元素的定位
链的默认行为是在可用空间中平均分布元素。如果一个或多个元素使用MATCH_CONSTRAINT,它们将使用可用的空白空间(在它们之间平均分配)。 layout_constraintHorizontal_weight和layout_constraintVertical_weight属性将控制如何使用MATCH_CONSTRAINT在元素之间分配空间。例如,在使用MATCH_CONSTRAINT的包含两个元素的链上,第一个元素使用权重2,第二个元素使用权重1,第一个元素占用的空间将是第二个元素占用的空间的两倍。
在链中的元素上使用边距时,边距是相加的。
例如,在水平链上,如果一个元素定义了10dp的右边距,而下一个元素定义了5dp的左边距,则这两个元素之间产生的边距为15dp。
在计算链用于定位项目的剩余空间时,会同时考虑项目及其边距。剩余空间不包含边距。
除了前面详述的内在功能之外,您还可以使用ConstraintLayout中的特殊帮助程序对象来帮助您进行布局。 目前,Guideline对象允许您创建相对于ConstraintLayout容器定位的水平和垂直指南。 然后可以通过将小部件限制为这样的指导来定位小部件。
在1.1中我们公开了约束优化器。 您可以通过将标记app:layout_optimizationLevel添加到ConstraintLayout元素来决定应用哪些优化。
none:不应用任何优化 standard :默认。 仅优化直接和屏障约束 direct:优化直接约束 barrier:优化障碍限制 chain:优化链约束(实验) dimensions:优化维度度量(实验),减少匹配约束元素的度量数量
约束布局ConstraintLayout使用详解
从 Android Studio 2.3 起,官方的模板默认使用 ConstraintLayout 。 ConstraintLayout 官方文档 ,之前项目中用的比较少,有些属性不是很熟练,做个笔记方便查找
注意点:
两个 TextView 的高度不一致,但是又希望他们文本对齐,这个时候就可以使用 layout_constraintBaseline_toBaselineOf
我们只有设置了相应的约束margin才有效,如设置了 layout_constraintLeft_toLeftOf 或者 layout_constraintLeft_toRightOf 后 layout_marginLeft 才会生效。
goneMargin 主要用于约束的控件可见性被设置为 gone 的时候,使用的 margin 值是否有效,属性如下:
控件的尺寸可以通过四种不同方式指定:
当控件的高度或宽度为wrap_content时,可以使用下列属性来控制最大、最小的高度或宽度: android:minWidth 最小的宽度 android:minHeight 最小的高度 android:maxWidth 最大的宽度 android:maxHeight 最大的高度 注意!当ConstraintLayout为1.1版本以下时,使用这些属性需要加上强制约束,如下所示: app:constrainedWidth=”true” app:constrainedHeight=”true”
官方不推荐在ConstraintLayout中使用 match_parent ,可以设置 0dp (MATCH_CONSTRAINT) 配合约束姿缓代替 match_parent
当宽或高至少有一个尺寸被设置为0dp时,可以通过属性 layout_constraintDimensionRatio 设置宽高比
如果两个或以上控件通过下图的方式约束在一起,就可以认为是他们是一条链(图为横向的链,纵向同理)。
layout_constraintHorizontal_chainStyle 默认为 spread ,效果如图
另外两个取值 packed
spread_inside
Guildline是一条辅助线,帮助庆伍你完成布局但它不会显示在界面上。 Guildline的主要属性: android:orientation :垂直 vertical ,水平 horizontal layout_constraintGuide_begin 指定位置距离开始 layout_constraintGuide_end 指定位置距离结束 layout_constraintGuide_percent 距离顶部的百分比(orientation = horizontal时则为距离左边)
假设有3个控件ABC,C在AB的右边,但是AB的宽是不固定的,这个时候C无论约束在A的右边或者B的右边都不对。当出现这种情况誉册或可以用Barrier来解决。Barrier可以在多个控件的一侧建立一个屏障,如下所示:
效果如下
Group可以把多个控件归为一组,方便隐藏或显示一组控件,举个例子:
设置 group 的 visibility 为 invisible ,则text1与text3均不可见。
Placeholder 指的是占位符,可以定义一个位置,当给 Placeholder 使用 setContentId() 设置另一个控件的id,使这个控件移动到占位符的位置了
在Activity中设置
实现点击四个角的那一个按钮,那么该按钮就会显示在正中间
Android-ConstraintLayout(约束布局)-Centering/Circular and with Bias了解一下
居中显示不难哈,分两种:水平居中、垂直居中;
在相对布局里面可以 layout_centerXxxxxx 来设置居中,而在约束布局里面是这样考虑的:其实居中就是既然靠左/上,也要靠右/下, 这样渲染时就知道, “哦,原来你是想居中哇”。
然后现在我们有两个控件都设置了左右上的相对位置约束, 都居中了。现在我想让其中一个控件距离没掘迟parent左边=%20 screen_width?一旦你设置了既靠左,又靠右,那么自然就是居中了,怎么设置距离左边距离呢? 其实有两种, 一是设置间距, 第二种是利用偏离率 layout_constraintHorizontal_bias *来设置百分比.
1.利用 layout_marginLeft 来设置间距,你还需要适配不同散配分辨率机型,麻烦。而且还需要注意一点,利用marginLeft时不能设置靠右属性哟!!!其实想想,有了marginleft,枯李还需要靠右属性么?自然没有必要了塞....
2.领用bias的话就好些了,至少利用百分比不用去做什么适配,能保证不同分辨率机型上比例一致..
a。首先看看居中,以及marginleft的方式:
b。再看看bias的方式
在布局管理器你也可以随意拖动调试查看各种布局的效果,琢磨琢磨就会越来越熟悉。嗯。加油,么么哒....
官网:
ConstraintLayout | Android Developersdeveloper.android.google.cn
ConstraintLayout使用
宽度或者高度设置为 0dp 的时候表示充满约束: match constraint 使用权重时,宽度或者高度要充满约束。 单位前面加上数字需要以文字的下面为基准: 这样让 ¥ 的符号和前面的数字的 baseline 在一条线。 如果几个 View 想要一起做一些操作这样两个 TextView 在一起实现了屏幕居中。 约束布局中可以使用宽高比例来设置View的大小 这样宽和高的比例就是1:1。 如果在比例的前面加上W或者H表示宽和高是计算得出: 比如上面是一个 ImageView ,下面是 TextView , TextView 的宽度不定,而 TextView 最大宽度需要和 ImageView 宽度保持一致: 上面布局中的 TextView 宽度受到 iv 的约束,最大宽度不会超过 iv 。 guideline 相当于在布局中加了一条隐藏的线,可以以这条线为基准进仔衡丛行布局: 可以指定 guideline 为竖线还是横线。 guideline 的位置可以用 begin 或者 end 还有百分比 percent 来指定。 比如下图中我使用了两条 guideline ,一条是 60dp 的竖线和一条百分比是 20% 的横线:设置圆心 设置角度 设置半径: 下图表示以 circle_iv 为圆心,在半径 200dp 角度是 30 度的地方放了一个 out_iv :placeholder 可以替换成其他的 view : 当点击下面的 imageview 的时候可以将 placeholder 替换成 imageview : 进入 setContentId 方法: 这个方法会将 mContentId 换成要替换的 id ,然后执行 updatePreLayout 方法: 根据 mContentId 找到 view 并赋值给 mContent ,随后进行布局: 最后执行 onDraw 方法。 在 constraint_referenced_ids 里面的 View 就会全部隐藏念樱。 barrier 表示屏障的意思,比如有多个 view ,总是以最长的 view 为最大宽度,然后 barrier 后面再添加其他 view 。constraint_referenced_ids 表示作用宽度的控件。 barrierDirection 表示添加到那些控件的位置。 我们可以根据需求来自定义 ConstraintHelper 。 ConstraintHepler 中设置的 View 个数默认是32个: 在 ConstraintLayou t的 onMeasure 中执行 onLayout 中执行: protected void onLayout(boolean changed, int left, int top, int right, int bottom) { helperCount = this.mConstraintHelpers.size(); if (helperCount 》 0) { for(int i = 0; i 《 helperCount; ++i) { ConstraintHelper helper = (ConstraintHelper)this.mConstraintHelpers.get(i); helper.updatePostLayout(this); } } 可以发现会执行 ConstraintHelper 的 updatePostMeasure 和 updatePostLayout 方法,可以在这两个方拦袭法中对 View 做一些操作。
Android 新控件之ConstraintLayout(约束布局)
ConstraintLayout (约束布局) 继承于ViewGroup 允许开发者以灵活的方式定位和调整小部件的大小
ConstraintLayout 可让开发者使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局。它与 RelativeLayout 相似,其中所有的视图均根据同级视图与父布局之间的关系进行布局,但其灵活性要高于 RelativeLayout ,并且更易于与 Android Studio 的布局器配合使用。我理解为ConstraintLayout是一个更加灵活且减少嵌套的 RelativeLayout 的布局
ConstraintLayout作为支持库提供,开发者可以在从 API 级别 9 (Gingerbread) 开始的 Android 系统上使用。
相信在面对一些复杂的UI页面,咱们都是使用 RelativeLayout , LinearLayout 层层嵌套实现的.虽然能实现效果.但是层层嵌套层层解析加载View 无疑会耗费加载时间,耗费手机性能.这是时候ConstraintLayout(约束布局),就应运而生了,它出现的目的就是减少嵌套,优化层层嵌套状况带来的弊端
要指袭在 ConstraintLayout 中定义某个视图的位置, 您必须为该视图添加至少一个水平约束条件和一个垂直约束条件 。每个约束条件均表示与其他视图、父布局或隐形引导线之间连接或对齐方式。每个约束条裂逗盯件均定义了视图在竖轴或者横轴上的位置;因此每个视图在每个轴上都必须至肆和少有一个约束条件,但通常情况下会需要更多约束条件。
当您将视图拖放到布局器中时,即使没有任何约束条件,它也会停留在您放置的位置。不过,这只是为了便于修改;当您在设备上运行布局时,如果视图没有任何约束条件,则会在位置 (左上角)处进行绘制。
在图 1 中,布局在器中看起来很完美,但视图 C 上却没有垂直约束条件。在设备上绘制此布局时,虽然视图 C 与视图 A 的左右边缘水平对齐,但由于没有垂直约束条件,它会显示在屏幕顶部
请注意,约束中不能有循环依赖。
相对定位是在 ConstraintLayout 中创建布局的基本构建块之一。这些约束允许您相对于另一个小部件定位给定的小部件。您可以在水平和垂直轴上约束一个小部件:
如下图,这告诉系统我们希望按钮 B 的左侧被约束到按钮 A 的右侧。这样的位置约束意味着系统将尝试让两侧共享相同的位置。
这是可用约束的列表:
app:layout_constraintLeft(自身)_toLeftOf(相对于的控件)="相对的控件ID"
1.2 layout_constraintBaseline_toBaselineOf 基线对齐
如果设置了侧边距,它们将应用于相应的约束(如果存在)(图 ),将边距强制为目标端和源端之间的空间。通常的布局边距属性可用于此效果
2.1属性:
请注意,边距只能为正数或等于零,并且取Dimension.
2.2. 约束目标View.GONE的时候 的边距
3.1 居中定位,就是把定位控件的左边对应目标的左边 右边对应目标的右边,上边对应目标的上边
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"
如上图,Button的左边位于父布局的左边,右边位于父布局的右边就做到了水平居中的效果
3.2 偏移 : 有时候居中展示还需要做出偏移效果
可以以一定角度和距离约束一个小部件中心相对于另一个小部件中心。这允许您将一个小部件定位在一个圆圈上
ConstraintLayout对标记为 的小部件进行了特定处理View.GONE。
GONE像往常一样,小部件不会被显示并且不是布局本身的一部分(即,如果标记为 ,它们的实际尺寸不会改变GONE)。 但就布局计算而言,GONE小部件仍然是其中的一部分,但有一个重要区别:
注意: 使用的边距将是 B 在连接到 A 时定义的边距(参见图 7 示例)。在某些情况下,这可能不是您想要的边距(例如,A 到其容器的一侧有 100dp 的边距,B 到 A 的边距只有 16dp,将 A 标记为已消失,B 到容器的边距为 16dp)。出于这个原因,您可以指定在连接到被标记为已消失的小部件时使用的备用边距值(请参阅 上面有关已消失的边距属性的部分 )
1.1 您可以为自身定义最小和最大尺寸ConstraintLayout
1.2 控件尺寸约束 android:layout_width可以通过 3 种不同方式设置和 android:layout_height属性 来指定控件的尺寸:
重要提示: MATCH_PARENT不建议用于ConstraintLayout. 可以通过MATCH_CONSTRAINT将相应的左/右或上/下约束设置为来定义类似的行为"parent"。
WRAP_CONTENT (添加在 1 . 1中):强制约束 如果维度设置为WRAP_CONTENT,则在 1.1 之前的版本中,它们将被视为文字维度——也就是说,约束不会限制结果维度。虽然通常这已经足够(并且更快),但在某些情况下,您可能希望使用WRAP_CONTENT,但继续强制执行约束以限制结果维度。在这种情况下,您可以添加相应的属性之一:
MATCH_CONSTRAINT维度(添加在 1 . 1中) 当维度设置为MATCH_CONSTRAINT时,默认行为是让结果大小占用所有可用空间。有几个额外的修饰符可用:
layout_constraintWidth_min和layout_constraintHeight_min: 将设置此维度的最小尺寸 layout_constraintWidth_max和layout_constraintHeight_max: 将设置此维度的最大尺寸 layout_constraintWidth_percent和layout_constraintHeight_percent: 将此维度的大小设置为父维度的百分比
比率: 宽高比 您还可以将小部件的一个维度定义为另一个维度的比率。为此,您需要将至少一个约束维度设置为0dp(即MATCH_CONSTRAINT),并将属性设置layout_constraintDimensionRatio为给定的比率。例如:
除此之外,在设置宽高比的值的时候,还可以在前面加W或H,分别指定宽度或高度限制。 例如: app:layout_constraintDimensionRatio="H,2:3"指的是 高:宽=2:3 app:layout_constraintDimensionRatio="W,2:3"指的是 宽:高=2:3
...
Guildline的主要属性:
Constraint 约束布局为了解决嵌套布局的弊端,更快的加载页面而出现,但是约束布局需要整体架构页面要有明确的构建页面的思维,故而学习以及思维模式要有的.所以个人感觉是简单页面还是用相对布局,线性布局就够了,对于复杂布局约束布局是你优化页面加载的不二之选. *写作不容易,且赞且珍惜!!!*
ConstraintLayout布局使用方法
填充 ⽔平⽅向填充⽗容器(通过 match_constraint ) app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_width="0dp" 备注:在早期版本中 match_parent 没有效果。 权重 为⽔平⽅向的控件设置权重,⼤⼩为 2:1:1 。 《!-- (view-1) --》 android:layout_width="0dp" app:layout_constraintHorizontal_weight="2" 《!-- (view-2) --》 android:layout_width="0dp" app:layout_constraintHorizontal_weight="1" 《!-- (view-3) --》 android:layout_width="0dp" app:layout_constraintHorizontal_weight="1" ⽂字基准线对⻬app:layout_constraintBaseline_toBaselineOf 圆形定位 通过「圆⼼」「⻆度」「半径」设置圆形定位 app:layout_constraintCircle="@id/view" app:layout_constraintCircleAngle="90" app:layout_constraintCircleRadius="180dp" 特殊属性 约束限制 限制控件⼤⼩不会超过约束范围。 app:layout_constrainedWidth="true" app:layout_constrainedHeight="true 偏向 控制控件在垂直⽅向的 30%的位置 app:layout_constraintTop_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.3" 除了配合百分⽐定位,还有⽤于配合有时在「哗团举约束限制」的条乱碧件下不需要居中效果的情况 垂直⽅向居顶部app:layout_constraintTop_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constrainedHeight="true" app:layout_constraintVertical_bias="0.0" 约束链 在约束链上的第⼀个控件上加上 chainStyle ,⽤来改变⼀组控件的布局⽅式 packed(打包) spread (扩散) spread_inside(内部扩散) 垂直⽅向 packed app:layout_constraintVertical_chainStyle="packed" 宽⾼⽐ ⾄少需要⼀个⽅向的值为 match_constraint,默认的都是「宽⾼⽐」,然后根据另外⼀条边和⽐例算出match_constraint 的值,x:y 默认表示的都是 width:height 宽是 0dp,⾼是 100dp,ratio 是 2:1 默认情况下是宽是 200dp,但是我们可以指定被约束的边是 height,那么宽度就是50 dp ⾼是 0dp,宽是 100 dp,ratio 是 2:1 默认情况下是⾼是 50 dp,但是我们指定被约束的边是 width,那么⾼度为200dp 百分⽐布局百分⽐布局 需要对应⽅向上的值为 match_constraint,百分⽐是 parent 的或肢百分⽐,⽽不是约束区域的百分⽐宽度是⽗容器的 30% android:layout_width="0dp" app:layout_constraintWidth_percent="0.3" 辅助控件 GuideLine 设置辅助线的⽅向 android:orientation="vertical" 设置辅助线的位置,根据⽅向不同 距离左侧或上侧的距离 layout_constraintGuide_begin 距离右侧或下侧的距离 layout_constraintGuide_end 百分⽐ layout_constraintGuide_percent Group 通过 constraint_referenced_ids 使⽤引⽤的⽅式来避免布局嵌套。 可以为⼀组控件统⼀设置 setVisibility 只有设置可⻅度的功能,不要指望这个来通知设置点击事件... Layer 和 Group 类似,同样通过引⽤的⽅式来避免布局嵌套,可以为⼀组控件统⼀设置旋 转/缩放/ 位移。Barrier 通过设置⼀组控件的某个⽅向的屏障,来 避免布局嵌套 。 Placeholder 通过 setContentId 来将指定控件放到占位符的位置。 Flow 通过引⽤的⽅式来避免布局嵌套。 wrapMode. chain. aligned. none(默认) 注意这个控件是可以被测量的,所以对应⽅向上的值可能需要被确定(即不能只约束同⼀⽅ 向的单个约束) ConstraintSet 使⽤ ConstraintSet 对象来动态修改布局。 防⽌布局中有⽆ id 控件时报错,需要设置 isForceId = false 通过 ConstraintSet#clone 来从 xml 布局中获取约束集。 布局扁平化更加容易做过渡动画
layout_marginEnd在constraintLayout中无效解决
设置了上前衡下左右约束,加个marginend不起作用,现在才发现要把宽设置为0dp.就可以了。(适应约束布局,出去margin之外) 《androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/zan_layout" android:layout_marginTop="脊悔誉@dimen/space_to_border" android:layout_below="@+id/indicator_layout" android:layout_width="match_parent" android:layout_height="wrap_content"》 《TextView android:id="@+id/textView4"樱段 android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="32dp" android:text="TextViewTextViewTextViewTextViewTextViewTextViewTextView" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toEndOf="@+id/textView3" app:layout_constraintTop_toTopOf="parent" /》 《/androidx.constraintlayout.widget.ConstraintLayout》
android studio约束布局 如何制作阵列
ConstraintLayout(约束布局), 是2016年Google I/O最新推出的Android布局, 目前还在完善阶段. 从推出的力度而言, 应该会成为主流布局样式. 在最新版本的Android Studio中, ConstraintLayout已经成为默认布局.
概念
ConstraintLayout约束布局的含义: 根据布局中的其他元素或视图, 确定View在屏幕中的位置. 包含三个重要信息, 根据其他视图设置位置, 根据父容器设置位置, 根据基准渣弊差线设置位置.
layout_constraint"
例如:
app:layout_constraintBottom_toBottomOf="@+id/constraintLayout"
约束当前View的底部至目标View的底部, 目标View是constraintLayout. 表明, 把当前View放置到constraintLayout(父容器)的底部, 并且底部一致.
为了演示多个示例, 使用复用的Activity页面. 根据参数设置标题和布局Id.
public class LayoutDisplayActivity extends AppCompatActivity { private static final String TAG = LayoutDisplayActivity.class.getSimpleName(); static final String EXTRA_LAYOUT_ID = TAG + ".layoutId"; // 布局ID @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(getIntent().getStringExtra(Intent.EXTRA_TITLE)); final int layoutId = getIntent().getIntExtra(EXTRA_LAYOUT_ID, 0); setContentView(layoutId); // 设置页面布局, 复用布局 }}主页面使用ListView展示多个项, 每项都是不同的布局. 点击项发送不同的Intent, 填充所要显示的页面.
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView list = (ListView) findViewById(R.id.activity_main); ArrayAdapter《String》 adapter = new ArrayAdapter《》(this, android.R.layout.simple_list_item_1, LIST_ITEMS); list.setAdapter(adapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 卜桥 @Override public void onItemClick(AdapterView《?》 adapterView, View view, int i, long l) { // 复用显示布局 Intent intent = new Intent(MainActivity.this, LayoutDisplayActivity.class); intent.putExtra(Intent.EXTRA_TITLE, LIST_ITEMS); // 布局Id 如皮 startActivity(intent); } }); }}基础
ConstraintLayout布局最基本的使用方式, 就是直接指定位置. 取消按钮的底部对齐constraintLayout(父容器)的底部, 左侧对齐父容器的左侧. 下一步按钮的底部对齐父容器的底部, 而左侧对齐取消按钮的右侧. 并且每个按钮边缘有Margin空隙.
***隐藏网址***ConstraintLayout的属性设置, 最重要的就是理解属性的表示含义.
Base
比例
ConstraintLayout布局除了对齐属性, 还有重要的比例属性. 中心(Center)按钮需要把全部边界与constraintLayout(父容器)边界对齐, 则为居中. 同时还可以设置水平与竖直的比例, 如0.25. Bias按钮设置水平与竖直的比例是0.25, 表示左侧与右侧比例是1:4, 上部与下部的比例是1:4.
constraintHorizontal_bias设置水平比例, constraintVertical_bias设置竖直比例.
***隐藏网址***tools:layout_editor_absoluteX属性对于视图起到辅助作用, 理解边界的真实距离, 点击可视化布局会自动生成.
Bias
引导线
ConstraintLayout布局除了与布局对齐以外, 还可以与引导线(Guideline)对齐. 设置竖直引导线(Guideline)距离左侧72dp. 按钮(Button)的左侧都与引导线对齐, 上下使用比例的方式排列, 一个0.25比例, 一个0.75比例.
***隐藏网址***Guide Line
视图尺寸
ConstraintLayout布局中的控件也可以设置填充尺寸. 控件把宽度设置为0dp会自动根据位置进行填充. 如Large按钮, 左侧对齐与Small按钮的左侧, 右侧对齐与constraintLayout父控件的右侧, 宽度设置为0dp, 实际会填充全部位置.
***隐藏网址***Measure
视图纵横比
ConstraintLayout布局还可以使用constraintDimensionRatio设置视图的纵横比, 则需要把宽(layout_width)或者高(layout_height)设置为0dp, 根据另一个属性和比例, 计算当前属性, 如两个图片控件的显示大小.
***隐藏网址***Ratio
ConstraintLayout约束布局的基本使用方式就是这些, 可以观察到ConstraintLayout布局兼顾LinearLayout与RelativeLayout的优点, 非常适合构建复杂布局, 会成为Android的主流布局方式.
更多文章:
java抽象类继承(java 中普通类继承,抽象类继承,接口类继承,子类一定要重写父类中的方法吗)
2024年7月10日 02:20
service account(serviceaccount没有token)
2024年4月14日 00:00
怎么查看sqlite数据中的数据(怎么查询sqlite里面第三行的数据)
2024年9月6日 20:15
test怎么读(Failed 和test这两个单词该怎么读要有声音哦)
2024年6月10日 14:22
java中相等怎么表示(java怎么比较两个字符串是否相等)
2024年6月15日 03:08
小时代人物关系图解(看过小时代123的进来,理解下里面的人物关系)
2024年7月23日 06:18
用kotlin开发android(谷歌放弃java,使用kotlin作为安卓开发第一语言的影响有哪些)
2024年7月21日 15:53