欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Material Design控件使用(一)——ConstraintLayout 约束布局

程序员文章站 2022-05-17 16:13:41
参考文章: "约束布局ConstraintLayout看这一篇就够了" "ConstraintLayout 属性篇" 介绍 Android 是谷歌推出替代 的组件。 支持相对布局、线性布局、帧布局,看来更像是 、 t、`RelativeLayout·三者的结合体,并且比这三者更强大的是实现了百分比布 ......

参考文章:
约束布局constraintlayout看这一篇就够了
constraintlayout - 属性篇

介绍

android constraintlayout是谷歌推出替代precentlayout的组件。

支持相对布局、线性布局、帧布局,看来更像是framelayoutlinearlayout、`relativelayout·三者的结合体,并且比这三者更强大的是实现了百分比布局。

大家都知道安卓碎片严重,使用百分比适配,那么将彻底解决适配问题

总结:我最近也是刚学,学完之后,发现这个布局已经将上述的所有布局的特点全部融合在一起了,使用起来简单方便的不要不要的,就是学习的属性有点多啊。

不过,多也是正常的,毕竟融合了五大布局的所有特点,学完这个布局,各种界面ui都难不倒我们了

添加依赖

implementation 'com.android.support.constraint:constraint-layout:1.1.3'

我使用的是android studio3.0.1版本,已经自动导入了,默认使用的就是这个布局

属性及对应的方法

我们先了解一下一些基本的概念

Android Material Design控件使用(一)——ConstraintLayout 约束布局

这里提一下,start和left其实都是指控件的左边,end和right都事指控件的右边

基本属性

注意,这里的属性都得使用命名空间来才能使用

宽高属性与之前的layout相同,wrap_contentmatch_parent但除此之外,还多出了一种,名为match contraint

实际上,这个多出来的相当于0dp,如果之前使用过linearlayout的权重的话,应该对0dp有印象.

这里,约束布局应该是继承了linearlayout的特性,之后我们设置权重与linearlayout的操作也是类似,具体的请往后面看,这可是实现了百分比布局的强大布局。

属性值为控件id

  • layout_constraintleft_toleftof 当前控件的左边依赖于属性控件的左边

  • layout_constraintleft_torightof 当前控件的左边依赖于属性控件的右边

  • layout_constraintright_toleftof

  • ayout_constraintright_torightof

  • layout_constrainttop_totopof

  • layout_constrainttop_tobottomof

  • layout_constraintbottom_totopof

  • layout_constraintbottom_tobottomof

  • layout_constraintbaseline_tobaselineof 当前的控件基线与属性控件的基线对齐

  • layout_constraintstart_toendof

  • layout_constraintstart_tostartof

  • layout_constraintend_tostartof

  • layout_constraintend_toendof

示例:
Android Material Design控件使用(一)——ConstraintLayout 约束布局

Android Material Design控件使用(一)——ConstraintLayout 约束布局

<?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">
    <button
        android:id="@+id/btna"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="a"
        app:layout_constraintstart_tostartof="parent"
        app:layout_constrainttop_totopof="parent"/>
    <button
        android:id="@+id/btnb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="b"
        app:layout_constrainttop_totopof="parent"
        app:layout_constraintstart_toendof="@id/btna"/>
</android.support.constraint.constraintlayout>

a左边依赖总布局的左边,顶部则是依赖总布局的顶部,b则是左边依赖于a的右边,顶部依赖父布局的顶部

其他的就不一一列举了,举一反三,挺容易的

mragin 边距

只有在设置了依赖,之后设置边距才会效果

这个属性不需要使用app开头,属于原本的属性

Android Material Design控件使用(一)——ConstraintLayout 约束布局

  • android:layout_marginstart 设置左边的边距

  • android:layout_marginend

  • android:layout_marginleft

  • android:layout_margintop

  • android:layout_marginright

  • android:layout_marginbottom

例如:

Android Material Design控件使用(一)——ConstraintLayout 约束布局

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

<button
    android:id="@+id/btna"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="a"
    android:layout_marginleft="30dp"
    android:layout_margintop="50dp"
    app:layout_constraintstart_tostartof="parent"
    app:layout_constrainttop_totopof="parent"/>
<button
    android:id="@+id/btnb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginstart="60dp"
    android:text="b"
    app:layout_constraintstart_toendof="@id/btna"/>
</android.support.constraint.constraintlayout>

示例:

使控件b与a垂直对齐

b的左边依赖a的左边,b的右边依赖a的右边即可

Android Material Design控件使用(一)——ConstraintLayout 约束布局

    <?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">
    
        <button
            android:id="@+id/btna"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginstart="124dp"
            android:layout_margintop="16dp"
            android:text="a"
            app:layout_constraintstart_tostartof="parent"
            app:layout_constrainttop_totopof="parent"/>
    
        <button
            android:id="@+id/btnb"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginend="8dp"
            android:layout_margintop="8dp"
            android:text="b"
            app:layout_constraintend_toendof="@+id/btna"
            app:layout_constraintstart_tostartof="@+id/btna"
            app:layout_constrainttop_tobottomof="@+id/btna"/>
             </android.support.constraint.constraintlayout>

辅助类或属性使用

1. barrier 屏障 控件

Android Material Design控件使用(一)——ConstraintLayout 约束布局

     <android.support.constraint.barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierdirection="right"
        app:constraint_referenced_ids="textview1,textview2" />
        

app:barrierdirection为屏障所在的位置,可设置的值有:bottomendleftrightstarttop

app:constraint_referenced_ids为屏障引用的控件,可设置多个(用“,”隔开)

2. gruop 组 控件

group可以把多个控件归为一组,方便隐藏或显示一组控件,举个例子:

      <android.support.constraint.group
        android:id="@+id/group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:constraint_referenced_ids="textview1,textview3" />

3. placeholder 占位符 控件

设置好占位符控件的位置,之后调用setcontent,把指定id的控件放在占位符的位置

app:content=

4. guideline 辅助线 控件

可以使用这个控件达到百分比布局的效果,或者是当前的控件没有符合条件的参照物的情况使用

guideline还有三个重要的属性,每个guideline只能指定其中一个:

  • layout_constraintguide_begin,指定左侧或顶部的固定距离,如100dp,在距离左侧或者顶部100dp的位置会出现一条辅助线

  • layout_constraintguide_end,指定右侧或底部的固定距离,如30dp,在距离右侧或底部30dp的位置会出现一条辅助线

  • layout_constraintguide_percent,指定在父控件中的宽度或高度的百分比,如0.8,表示距离顶部或者左侧的80%的距离。

  • android:orientation 设置垂直或者是水平

guideline是隐藏的,不用我们进行多余的设置,虽然外面在预览面板可以死看到它的存在

例子:使一个按钮的长度占满屏幕一半

Android Material Design控件使用(一)——ConstraintLayout 约束布局

    <android.support.constraint.guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/guidelinebegin"
        app:layout_constraintguide_percent="0.5"
        android:orientation="vertical"/>

    <button
        android:text="button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        app:layout_constraintstart_tostartof="parent"
        app:layout_constraintend_tostartof="@+id/guidelinebegin"
        app:layout_constrainttop_totopof="parent" />

radio 比例 属性

方便快捷调整控件的宽高比,结合guideline使用更佳

例子:
Android Material Design控件使用(一)——ConstraintLayout 约束布局

app:layout_constraintdimensionratio

想要宽度与总布局一样,但高度是宽度的三分之一

宽高比为3:1

    <button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintdimensionratio="3:1"/>
        
        

chain 链 属性

可以把这个当做成一个加强版的linearlayout

Android Material Design控件使用(一)——ConstraintLayout 约束布局

由上图,很好的知道了a与b的约束,a的左边是父控件的左边,右边则是b,b的左边是a,b的右边的是父控件的右边

chainstyle有三种属性,分别是spread,spread_inside,pack,效果如下图

  • spread 元素将展开(默认)

  • spread_inside 元素展开,但链的端点不会展开

  • pack 链中的元素将包裹在一起。子控件的水平或垂直方向的偏置bias属性会影响包裹中元素的位置

Android Material Design控件使用(一)——ConstraintLayout 约束布局

剩下的两种则是通过添加属性实现的

weighted chain是在spread chain的基础上,而packed chain with bias则是在weight chain的基础上

style为spread的,使用layout_constrainthorizontal_weightlayout_constraintvertical_weight来设置weigh权重

style为pack的,使用layout_constrainthorizontal_biaslayout_constraintvertical_bias进行偏移设置,属性值0-1,也是百分比,改第一个元素

这里需要说明的是,除了水平,还可以是垂直排列,不过,不能通过属性来更改,而是通过约束来更改,把左边改为顶端,右边改为底部

如果是水平的,使用属性layout_constrainthorizontal_chainstyle进行chainstyle属性的更改

垂直的则是使用layout_constraintvertical_chainstyle

例子:

三个按钮平分宽度(只需要将宽度设置为0dp就可以达到目的)

    <button
        android:id="@+id/btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="button"
        app:layout_constraintend_tostartof="@id/btn1"
        app:layout_constrainttop_totopof="parent"
        app:layout_constraintstart_tostartof="parent"/>
    <button
        android:id="@+id/btn1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="button"
        app:layout_constraintstart_toendof="@id/btn"
        app:layout_constraintend_tostartof="@id/btn2"/>
    <button
        android:id="@+id/btn2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="button"
        app:layout_constraintstart_toendof="@id/btn1"
        app:layout_constraintend_toendof="parent"/>