详解Android ConstraintLayout 约束布局的用法

前言

在2016年的Google I/O大会上 , Google 发布了Android Studio 2.2预览版,同时也发布了Android 新的布局方案 ConstraintLayout , 但是最近的一年也没有大规模的使用。2017年Google发布了 Android Studio 2.3 正式版,在 Android Studio 2.3 版本中新建的Module中默认的布局就是 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"
  tools:context="com.constraintlayout.app.Main2Activity">
</android.support.constraint.ConstraintLayout>

在使用 ConstraintLayout 的布局方案,需要在 build.gradle 引入支持库:

dependencies {
  compile 'com.android.support.constraint:constraint-layout:1.0.1'
}

传统的Android开发当中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方便,我也一直都不推荐使用可视化的方式来编写Android应用程序的界面。

而ConstraintLayout就是为了解决这一现状而出现的。它和传统编写界面的方式恰恰相反,ConstraintLayout非常适合使用可视化的方式来编写界面,但并不太适合使用XML的方式来进行编写。当然,可视化操作的背后仍然还是使用的XML代码来实现的,只不过这些代码是由Android Studio根据我们的操作自动生成的。

另外,ConstraintLayout 还有一个优点,它可以有效地解决布局嵌套过多的问题。我们平时编写界面,复杂的布局总会伴随着多层的嵌套,而嵌套越多,程序的性能也就越差。ConstraintLayout则是使用约束的方式来指定各个控件的位置和关系的,它有点类似于 RelativeLayout,但远比RelativeLayout要更强大。

ConstraintLayout向下兼容 API 9

关于 ConstraintLayout 的基本使用方法请参照郭神的博客:http://www.jb51.net/article/126440.htm

这篇文章说一些其他的特性。

常用方法总结

layout_constraintTop_toTopOf    // 将所需视图的顶部与另一个视图的顶部对齐。
layout_constraintTop_toBottomOf  // 将所需视图的顶部与另一个视图的底部对齐。
layout_constraintBottom_toTopOf  // 将所需视图的底部与另一个视图的顶部对齐。
layout_constraintBottom_toBottomOf // 将所需视图的底部与另一个视图的底部对齐。
layout_constraintLeft_toTopOf   // 将所需视图的左侧与另一个视图的顶部对齐。
layout_constraintLeft_toBottomOf  // 将所需视图的左侧与另一个视图的底部对齐。
layout_constraintLeft_toLeftOf   // 将所需视图的左边与另一个视图的左边对齐。
layout_constraintLeft_toRightOf  // 将所需视图的左边与另一个视图的右边对齐。
layout_constraintRight_toTopOf   // 将所需视图的右对齐到另一个视图的顶部。
layout_constraintRight_toBottomOf // 将所需视图的右对齐到另一个的底部。
layout_constraintRight_toLeftOf  // 将所需视图的右边与另一个视图的左边对齐。
layout_constraintRight_toRightOf  // 将所需视图的右边与另一个视图的右边对齐。

constraintDimensionRatio

这个属性就是把一个View的尺寸设为特定的宽高比,比如设置一张图片的宽高比为 1:1,4:3, 16:9 等。通过使用ConstraintLayout,只需使用layout_constraintDimensionRatio属性即可。

<?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:id="@+id/constraintLayout"
  tools:context="com.constraintlayout.app.MainActivity"
  >

  <ImageView
    android:id="@+id/cat_image"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintDimensionRatio="4:3"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintHorizontal_bias="0"
    android:src="@mipmap/cat"
    />

  <ImageView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher"
    app:layout_constraintDimensionRatio="4:3"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/cat_image"
    app:layout_constraintVertical_bias="0.0"
    app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.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"
  android:id="@+id/constraintLayout"
  tools:context="com.constraintlayout.app.MainActivity"
  >

  <Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    />
</android.support.constraint.ConstraintLayout>

我们得到的布局效果如下:

那么我们有个疑问,为什么Button 是居中显示的?因为在上面的布局中有两个重要的属性没有写出来,但是却有默认的属性值,那就是水平、垂直的偏移比例。

layout_constraintHorizontal_bias //控件的水平偏移比例
layout_constraintVertical_bias  //控件的垂直偏移比例

如果在布局文件中没有明确的写出偏移比例,那么系统默认偏移比例值为:0.5 。

到这里我们已经清楚了,上面的布局文件就相当于:

<?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:id="@+id/constraintLayout"
  tools:context="com.constraintlayout.app.MainActivity"
  >

  <Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintVertical_bias="0.5"
    />
</android.support.constraint.ConstraintLayout>

我们可以试试,更改Button 的偏移值试试看,比如,水平偏移0.3 , 垂直偏移0.7 , 看看效果:

可以看到很明显,Button 在水平方向向右偏移比例为 30% , 在垂直方向向下偏移比例为 70% 。

基线约束控键

该控键帮助你对齐任意两个widget的文字部分,与widget的大小无关。例如你有两个不同尺寸的widget但是你想要他们的文字部分对齐。

layout_constraintBaseline_toBaselineOf

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android新特性ConstraintLayout完全解析
  • Android新布局方式ConstraintLayout快速入门教程
  • Android利用ConstraintLayout实现漂亮的动画详解
(0)

相关推荐

  • Android新布局方式ConstraintLayout快速入门教程

    前言 在Android开发中,我们通常是手写布局,很少会用拖动来写布局,虽然ConstraintLayout在I/O上以拖动来展现了各种功能,我估计在以后开发中,程序员还是习惯手撸代码. 我自己试着拖着用了一下,用得不是很明白 ,而且用起来效果不是很好. 那么 直接上手撸了一下~~~ 其实很简单 Button1:app:layout_constraintBottom_toTopOf="@id/iv_head" 我们把这个属性拆开来看,constraintBottom指的本身的底部,即B

  • Android新特性ConstraintLayout完全解析

    本文同步发表于我的微信公众号,在微信搜索 郭霖 即可关注,每天都有文章更新. 今天给大家带来2017年的第一篇文章,这里先祝大家新年好. 本篇文章的主题是ConstraintLayout.其实ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能.我们都知道,在传统的Android开发当中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方

  • Android利用ConstraintLayout实现漂亮的动画详解

    前言 最近ConstrainLayout是Android中比较火的一个东西.ConstrainLayout可以使View层级扁平化,提升性能,支持任意的边框,其目的就是修复之前layout的一些短板.其实ConstrainLayout还有一个大多数人没有注意到的特性:可以利用Constrainlayout快速构建漂亮的动画效果. 方法 我这里假设已经你已经掌握了Constrainlayout基本知识(比如:app:layout_constraintLeft_toLeftOf等).Constrai

  • 详解Android ConstraintLayout 约束布局的用法

    前言 在2016年的Google I/O大会上 , Google 发布了Android Studio 2.2预览版,同时也发布了Android 新的布局方案 ConstraintLayout , 但是最近的一年也没有大规模的使用.2017年Google发布了 Android Studio 2.3 正式版,在 Android Studio 2.3 版本中新建的Module中默认的布局就是 ConstraintLayout .如下所示: <?xml version="1.0" enc

  • 详解Android studio 动态fragment的用法

    fragment的使用时Android的基础,它有两种用法,第一个就是静态的fragment.第二个则是动态的fragment. 静态fragment直接在layout创建你想要的fragment的XML的文件,然后在你的Java包里面创建对应fragment的class文件 布局代码如下所示 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:

  • 实例详解Android Selector和Shape的用法

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和selector在美化控件中的作用是至关重要的. 1:Selector drawable的item中可以有以下属性: android:drawable="@[package:]drawable/drawable_resource" android:state_pressed=["

  • 详解Android TableLayout表格布局

    表格布局的标签是TableLayout,TableLayout继承了LinearLayout.所以它依然是一个线性布局. 前言: 1.TableLayout简介 2.TableLayout行列数的确定 3.TableLayout可设置的属性详解 4.一个包含4个TableLayout布局的实例及效果图 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="h

  • Android中ConstraintLayout约束布局的最全详细解析

    目录 一.ConstraintLayout概述 二.ConstraintLayout基础篇 2.1 基础操作 2.2 控件间添加约束 2.3 约束布局xml代码实现 三.ConstraintLayout 进阶篇 3.1 Chains链 3.2 尺寸约束 3.3 百分比布局 3.4 radio属性 3.5 圆形定位 四.ConstraintLayout 高级篇 4.1 Guideline 4.2 Group 4.3 Barrier 总结 一.ConstraintLayout概述 Constrain

  • 详解Android TableLayout中stretchColumns、shrinkColumns的用法

    详解Android 中TableLayout中stretchColumns.shrinkColumns的用法 android:stretchColumns="1" android:shrinkColumns="1"这两个属性是TableLayout所特有的,也是这两个属性影响了子对象的布局. 表格布局是按照行列来组织子视图的布局.表格布局包含一系列的Tabrow对象,用于定义行(也可以使用其它子对象).表格布局不为它的行.列和单元格显示表格线.每个行可以包含个以上(

  • 详解Android 硬布局item的高级写法

    本文主要介绍了Android 硬布局item的高级写法,分享给大家,具体如下: 效果: 这种布局应该是非常常见了,且写的比较多. 今天简单探讨一下效果图中上下两种布局的写法. 比较 上下效果一致 行数 层级 上部分 121 3 下部分 55 2 下部分继续精简 28 2 可以看出,对比还是很明显的,精简到最后只有最开始的四分之一. 上部分 先看常规item写法,横向的LinearLayout嵌套三个子View,分别是 左边的ImageView, 中间的TextView, 和右边的ImageVie

  • 详解Android布局加载流程源码

    一.首先看布局层次 看这么几张图 我们会发现DecorView里面包裹的内容可能会随着不同的情况而变化,但是在Decor之前的层次关系都是固定的.即Activity包裹PhoneWindow,PhoneWindow包裹DecorView.接下来我们首先看一下三者分别是如何创建的. 二.Activity是如何创建的 首先看到入口类ActivityThread的performLaunchActivity方法: private Activity performLaunchActivity(Activi

  • 详解android adb常见用法

    ADB,即 Android Debug Bridge,是 Android 开发/测试人员不可替代的强大工具. adb与应用的连接 1.启动/停止 启动 adb server 命令: adb start-server (一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起.) 停止 adb server 命令: adb kill-server 2.查看 adb 版本 命令: adb version 输出为: C:\WINDOWS\system32>adb

  • 详解Android 多级联动控件实现思路讨论

    最近有一个需求是选择多级联动数据,数据级别不固定,可能是五级,可能是两级,具体看用户等级. 所以就需要一个多级联动选择控件 ,在网上一番搜索或找到了这个控件, Android-PickerView 这个控件在三级以内的的联动都没有问题,但是最多只能到三级. 我在原有的基础上做了一些扩展,主要是添加了两个 picker MultiWheelPickerView 可以根据数据动态生成多个滚轮,不再局限于两个三个选项 DynamicWheelPickerView 也是动态生成,但可以一级一级的加载数据

随机推荐