转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120730533
本文出自【赵彦军的博客】

文章目录

  • 5个步骤
  • 修改约束-修改控件约束条件
  • 修改约束-布局切换

Android ConstraintLayout 约束布局详解

Android ConstraintLayout ConstraintSet动态布局

在传统布局方式中,如果要改变某个控件的位置,需要获取 LayoutParams , 后台修改属性值就行了。

但是在约束布局 ConstraintLayout 中,要改变控件的约束条件,需要用到 ConstraintSet 类。主要有 5 个步骤

5个步骤

  • 第一步:创建 ConstraintSet() 实例
 val set = ConstraintSet()
  • 第二步:需要复制一份父布局的约束,方法有三个如下
set.clone(constraintLayout: ConstraintLayout);
set.clone(set: ConstraintSet);
set.clone(context: Context, constraintLayoutId: Int);
  • 第三步:设置组件之间的约束了
set.connect(int startID, int startSide, int endID, int endSide)
set.connect(int startID, int startSide, int endID, int endSide, int margin)
set.centerHorizontally(int viewId, int toView)
set.centerVertically(int viewId, int toView)
  • 第四步:设置一个动画,并且要求api版本为19及以上
TransitionManager.beginDelayedTransition(ViewGroup sceneRoot)
  • 第五步:apply一下使设置生效
set.applyTo(ConstraintLayout constraintLayout)

修改约束-修改控件约束条件

我们先写一个布局

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/root"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/view1"android:layout_width="0dp"android:layout_height="50dp"android:background="#f00"android:gravity="center"android:text="view1"android:textColor="#fff"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintWidth_percent="0.5" /><TextViewandroid:id="@+id/view2"android:layout_width="0dp"android:layout_height="50dp"android:background="@color/black"android:gravity="center"android:text="view2"android:textColor="#fff"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.2"app:layout_constraintWidth_percent="0.2" /></androidx.constraintlayout.widget.ConstraintLayout>

重新定义约束条件如下:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val rootLayout: ConstraintLayout = findViewById(R.id.root)val view1: View = findViewById(R.id.view1)val view2: View = findViewById(R.id.view2)view1.setOnClickListener {val set = ConstraintSet()set.clone(rootLayout)//view1,view2 顶部对齐set.connect(R.id.view1, ConstraintSet.TOP, R.id.view2, ConstraintSet.TOP)//view1左边对齐view2左边,距离20pxset.connect(R.id.view1, ConstraintSet.START, R.id.view2, ConstraintSet.END, 10)//增加过渡动画,动画也可以不用加,但是效果比较生硬if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {TransitionManager.beginDelayedTransition(rootLayout)}set.applyTo(rootLayout)}view2.setOnClickListener {val set = ConstraintSet()set.clone(rootLayout)//在父布局中垂直居中显示set.centerVertically(R.id.view2, ConstraintSet.PARENT_ID)//增加过渡动画,动画也可以不用加,但是效果比较生硬if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {TransitionManager.beginDelayedTransition(rootLayout)}set.applyTo(rootLayout)}}
}

效果如下:

修改约束-布局切换


首先定义两个布局,第一个布局 activity_main.xml:是一行显示4个图标

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/root"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:id="@+id/view1"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/weixin"app:layout_constraintEnd_toStartOf="@id/view2"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/view2"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/weibo"app:layout_constraintEnd_toStartOf="@id/view3"app:layout_constraintStart_toEndOf="@id/view1"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/view3"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/aqq1"app:layout_constraintEnd_toStartOf="@id/view4"app:layout_constraintStart_toEndOf="@id/view2"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/view4"android:layout_width="50dp"android:layout_height="50dp"app:layout_constraintStart_toEndOf="@id/view3"android:src="@drawable/dingding"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

第二个布局 activity_main2.xml:2行显示4个图标

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/root"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:id="@+id/view1"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/weixin"app:layout_constraintEnd_toStartOf="@id/view2"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/view2"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/weibo"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toEndOf="@id/view1"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/view3"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/aqq1"app:layout_constraintEnd_toStartOf="@id/view4"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/view1" /><ImageViewandroid:id="@+id/view4"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/dingding"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toEndOf="@id/view3"app:layout_constraintTop_toTopOf="@id/view3" /></androidx.constraintlayout.widget.ConstraintLayout>


通过代码切换两个视图:

package com.example.myapplicationimport android.os.Build
import android.os.Bundle
import android.transition.TransitionManager
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSetclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val rootLayout: ConstraintLayout = findViewById(R.id.root)val view1: View = findViewById(R.id.view1)val view2: View = findViewById(R.id.view2)//1行切换到2行view1.setOnClickListener {val set = ConstraintSet()set.clone(this, R.layout.activity_main2)//增加过渡动画,动画也可以不用加,但是效果比较生硬if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {TransitionManager.beginDelayedTransition(rootLayout)}set.applyTo(rootLayout)}//2行切换到1行view2.setOnClickListener {val set = ConstraintSet()set.clone(this, R.layout.activity_main)//增加过渡动画,动画也可以不用加,但是效果比较生硬if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {TransitionManager.beginDelayedTransition(rootLayout)}set.applyTo(rootLayout)}}
}

Android ConstraintLayout ConstraintSet动态布局相关推荐

  1. Google I/O:Android ConstraintLayout 扁平化布局入门 andstudio 2.2

    序 在Google IO大会中不仅仅带来了Android Studio 2.2预览版,同时带给我们一个依赖约束的库. 简单来说,她是相对布局的升级版本,但是区别与相对布局更加强调约束.何为约束,即控件 ...

  2. Android ConstraintLayout 扁平化布局入门

    在Google IO大会中不仅仅带来了Android Studio 2.2预览版,同时带给我们一个依赖约束的库. 简单来说,她是相对布局的升级版本,但是区别与相对布局更加强调约束.何为约束,即控件之间 ...

  3. android 卡片放大变详情页,ConstraintLayout动画实现布局卡片式滑动放大缩放

    ConstraintLayout(约束布局)是Android Studio 2.2中主要的新增功能之一,Android studio升级到2.3版本之后,不管是新建Activity或fragment, ...

  4. android动态更改布局宽高,动态更改Android上的线性布局宽度或高度

    我试图动态更改线性布局或任何其他窗口小部件宽度或高度,但引发异常.动态更改Android上的线性布局宽度或高度 我的布局: android:id="@+id/abc" androi ...

  5. Android布局动态化,一种基于堆积木思想的卡片式Android动态布局方法与流程

    本发明涉及android界面布局,特别是一种基于堆积木思想的卡片式Android动态布局方法. 背景技术: 在Android流行的今天,android App在生活中使用日益广泛,相对PC,手机由于界 ...

  6. android如何引用布局,android 动态布局与引用第三方layout中的布局

    引用第三方layout中的布局LinearLayout rightContentView = (LinearLayout) findViewById(R.id.lyt_chat_content); V ...

  7. android 动态绘制布局,Android代码和绘制曲线中按钮和绘图板的动态布局

    时间: 2019年1月11日 本文向您介绍Android代码中的按钮和绘图板的动态布局和绘制曲线,主要包括示例android 动态绘制曲线,应用技巧,基本知识和知识android 动态绘制曲线,包括A ...

  8. android 绑定布局,android – 在数据绑定中设置动态布局高度

    我想在数据绑定结构中设置动态布局高度. 我试了一下,但我得到了这个例外: java.lang.NullPointerException: Attempt to invoke virtual metho ...

  9. Android ConstraintLayout 约束布局

    说明 Google I/O 2016 上发布了 ConstraintLayout, 简直是要变革 Android 写界面方式. 于是第二天我立即找到相关文档尝试, 这是官方提供的 Codelab 项目 ...

最新文章

  1. apache laravel主页500_PS强大笔刷,插画师完美Hold住各种效果!(附500个笔刷)
  2. 蝉联IDC机器学习平台市场No.1 第四范式市场领先优势持续扩大
  3. 参加动画电影《魔比斯环》首映
  4. java导出jar带第三方库_在.jar文件中导出java库
  5. WebM VP8 SDK Usage/关于WebM VP8 SDK的用法
  6. 可有可无的Mysql工作技巧 2
  7. 万能监控摄像头app软件下载_360eyes官方下载安装最新版本-360eyes摄像头手机app下载v3.7.8.40 安卓版...
  8. iphone怎么换手机铃声?只需要一招 iRingg
  9. Unity3D数学工具(Mathf)
  10. 前端使用cesium加载地球
  11. 中国内蒙古医企在“吴哥国际医院”开展“千人一对一国际医疗捐助”
  12. Echarts南丁格尔玫瑰图、锥形柱状图、渐变曲线图
  13. 破而后立,破除陈旧,认识自我,而后顶天立地!
  14. 动词ing形式的5种用法_动词ing形式的用法及变化规则
  15. php7关闭缓存、禁用缓存
  16. 从端到云:飞腾平台全栈解决方案白皮书
  17. IT加油站课程调价通告
  18. 【java】微信支付生成签名的过程
  19. Flutter 自定义组件实战之Cupertino(iOS)风格的复选框
  20. 计算机毕业设计Java企业人事管理系统(源码+系统+mysql数据库+lw文档)

热门文章

  1. android 字符串转bitmap,android – 如何将Base64字符串转换为BitMap图像显示在ImageView?...
  2. coreelec ssh访问被拒绝_GitLab官网在线仓库SSH连接故障排查和经验总结实例
  3. span标签style的优先级_css样式引入优先级?
  4. Android 使用MD5对SharedPreferences密码进行加密
  5. 六十三、栈在括号匹配和表达式求值中的应用
  6. 六、Hbase的构架,安装和基本使用
  7. 十、Docker快速搭建Elastic Stack(下篇)
  8. 六十四、SpringBoot中的模板引擎Thymeleaf
  9. 使用jieba 提取 关键词
  10. ES 6 +ES 5 的相关学习笔记