ConstraintLayout使用,提升布局性能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wengwuhua/article/details/85249701

ConstraintLayout是谷歌在2016年I/O大会上发布的全新布局,基本可以实现其他布局的全部功能,重要的是它解决了负责布局过多嵌套的问题,使得性能上有了很大提高。参考分析ConstraintLayout性能优势
对Android Studio的版本要求是2.2以上,现在Android Studio已经出到3.0+了,在新建布局文件时也是默认推荐用ConstraintLayout,而且它还具有很方便的可是化编辑功能,可以很方便的辅助我们完成布局工作。关于可视化的操作参考郭神ConstraintLayout新特性介绍
本文主要介绍XML代码实现的方式。
ConstraintLayout功能主要分为以下几类,分别介绍。

  1. 确定位置
    确定位置的共13个属性,其实本质上都是一样的,看名字就知道是哪一条边和哪一条边对齐。
ayout_constraintBaseline_toBaselineOf
layout_constraintLeft_toLeftOf
layout_constraintLeft_toRightOf。。。

分析:constraintXXX:指定当前控件需要设置约束的属性部分。如constraintLeft表示对当前控件的左边进行约束设置。
toXXXOf:其指定的内容是作为当前控件设置约束需要依赖的控件或父容器(可以理解为设置约束的参照物),并通过XXX指定被依赖对象用于参考的属性。

  1. 控件间边距margin
  • 普通的margin和其他布局的margin一样,都是android:layout_marginLeft等。
  • 在ConstraintLayout还提供了一种特殊的margin,可以设置在依赖控件gone之后的margin属性layout_goneMarginLeft等,这可以用来实现一些特殊的需求:如B控件依赖A,A距离父容器左边20dp,B在A右边,距离A为20dp。需求当A设置为GONE之后,B距离父容器左边60dp。
    在依赖的空间gone之后,其实可以理解其变为了一个点,所以依赖于它之上的依赖属性依然是有效的。
    但有时我们并不需要这样的性质,那么如何解决关于View gone引起的非预期的布局变化呢?
    1、如果可以,尽量使用invisible
    2、尽量其他view的布局不依赖会gone的view
    3、使用属性layout_goneMargin*=“xdp”

注意的点:

  • 要使margin生效,必须具有对应方向的layout_constraint*,否则margin不生效。
  • 控件除了可以设置普通的边距属性,还可以设置当控件依赖的控件GONE之后的边距属性。即我们可以理解可以根据被依赖控件是否GONE的状态,设置两种边距值。
  1. 居中和偏移bias
    居中:ConstraintLayout并没有如RelativeLayout类似的layout_centerVertical属性,而是通过两端相对父布局或控件的约束实现居中效果。如下实现水平居中
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent

在这里插入图片描述
可以理解为在控件两端施加了两个弹簧,默认情况下两个弹簧施加的力是一样的。
偏移:那么要实现偏移则只需某个端的力小一点就好了,ConstraintLayout提供了layout_constraintHorizontal_bias、layout_constraintVertical_bias偏移属性。bias即偏移量,他们的取值范围从0~1,0即挨着左边,1是挨着右边,所以要使处于1/3处,可以设置如下属性app:layout_constraintHorizontal_bias="0.33"

  1. View 尺寸
    控件尺寸的设置有以下几种方式:wrap_content、指定尺寸、match_parent(不推荐,因为设置之后其他约束条件都不起作用了)、MATCH_CONSTRAINT(设为0dp时的模式,即由约束确定尺寸)
  • wrap_content模式:当一个控件设为wrap_content时,再添加约束尺寸是不起效果的。如需生效,需要设置如下属性为true,使约束生效。
app:layout_constrainedWidth=”true”     
app:layout_constrainedHeight=”true”
  • MATCH_CONSTRAINT模式:即设置为0dp时的模式,但其并不是真的使控件宽高为 0dp,它的作用在layout_constraintWidth_default属性值的三种模式下有不同表现。
    1、 spread:默认值,意思是占用所有的符合约束的空间
    在这里插入图片描述
    2、percent:意思是按照父布局的百分比设置,需要layout_constraintWidth_percent等布局宽高比例属性配合设置百分比例
    (设置了layout_constraintWidth_percent属性,也可以不用指定layout_constraintWidth_default,他会自动设置为percent)。如下A控件宽度占所在父布局宽度40%
    在这里插入图片描述
    3、 wrap:匹配内容大小但不超过约束限制,注意和直接指定宽度为wrap_content的区别就是不超过约束限制。比如先让控件根据内容自适应宽度,但有不能让宽度超出左右控件的约束。
    对于wrap_content会超过约束限制,谷歌又新增了如下属性
app:layout_constrainedWidth=”true|false”
app:layout_constrainedHeight=”true|false” 

设置为true也可以限制内容不超过约束,不同的是它不会影响到约束控件。如B控件在内容超出后会换行显示,而wrap会继续撑大覆盖掉左边button的显示。

android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/button"
app:layout_constrainedWidth="true"

在这里插入图片描述

  1. 比例ratio
    ConstraintLayout支持设置控件的宽高比例,通过layout_constraintDimensionRatio属性设置,该属性起作用的前提是宽高其中一个为0dp。
  • 如果只有一项为0dp,则该项值按照比例计算出来。比如高为10dp,宽为0dp,radio为"2:1",则最终宽为20dp
  • 如果两项都为0dp,则尺寸会设置为满足约束的最大值并保持比例。因为这是系统计算的,有的时候不是我们想要的,我们也可以通过在前面加H、W来指定是哪一个边需要计算。例如"H,2:1",则是指宽度匹配约束,高度是宽度的1/2。

  1. 在一个水平或者竖直方向上,一排view两两互相约束,即为链。提供了在一个维度(水平或者垂直),管理一组控件的方式。
    在这里插入图片描述
    链头:链的最左边的元素称为链头。链的属性由链头决定。
    通过 layout_constraintHorizontal_chainStylelayout_constraintVertical_chainStyle在链的第一个元素上设置。默认spread样式。
    设置为不同属性的表现形式如下:
    在这里插入图片描述
    和LinearLayout一样,链也可以使用layout_constraintHorizontal_weight来分割剩余空间。但又和 android:layout_weight不太一样,不一样的地方如下:
  • layout_weight ,不管当前view的大小设的是多大,都会继续占据剩余空间。
  • layout_constraintHorizontal_weight,这个只对0dp并且layout_constraintWidth_defaultspread的view生效,使其大小按比例分割剩余空间,对于已经设定大小的view不生效。
  1. 圆形布局
    ConstraintLayout提供链一种特殊的布局方式,圆形布局,涉及到的参数也比较简单,有以下几个:
  • layout_constraintCircle : 圆心,值是某个view的id。
  • layout_constraintCircleRadius : 半径。
  • layout_constraintCircleAngle :角度,值是从0-360,0是指整上方。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Wengwuhua/article/details/85249701
今日推荐