ConstraintLayout布局扩展

news2024/11/25 18:34:39

相信大家对ConstraintLayout(约束布局)不陌生,这是google推出的一个强大控件,之所以强大其实主要归纳有两点:减少布局层次,能够轻松实现复杂布局。当然在我们实际使用过程中,是否真的减少了布局层次?其实这个问题从我开始用这个布局产生了疑问,看了下自己写的布局还是一层包一层。如果你也有这个问题,那么接下来文章中的内容能够帮助你解决.

1.约束布局基本使用:

 相信大家对于基本使用应该都没什么问题,这里就不做过多阐述,跟四大控件里面的相对布局思路类似。

2.约束布局辅助控件:

辅助控件就是今天的重点内容:今天重点说下GuideLine,Layer,Flow,group这四个辅助控件。我先贴下我demo布局

<?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/cons"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.helper.widget.Layer
        android:id="@+id/layer"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#D16D6D"
        app:constraint_referenced_ids="textview1,textview2,src"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textview1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="这是一个constrainlayout自带的流式布局Flow"
        android:textColor="@color/white"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/guideline"
        app:layout_constraintTop_toTopOf="parent" />


    <TextView
        android:id="@+id/textview2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="这是一个constraintlayout自带的Layer层布局"
        android:textColor="@color/white"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/guideline"
        app:layout_constraintTop_toBottomOf="@id/textview1" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.8" />

    <ImageView
        android:id="@+id/src"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintBottom_toBottomOf="@id/textview2"
        app:layout_constraintLeft_toRightOf="@id/guideline"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/textview1" />

    <androidx.constraintlayout.helper.widget.Flow
        android:id="@+id/demo_flow"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:flow_firstHorizontalBias="0"
        app:flow_firstHorizontalStyle="packed"
        app:flow_horizontalBias="0"
        app:flow_horizontalGap="10dp"
        app:flow_horizontalStyle="spread_inside"
        app:flow_lastHorizontalBias="0"
        app:flow_lastHorizontalStyle="packed"
        app:flow_verticalGap="8dp"
        app:flow_wrapMode="chain"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/textview2" />

</androidx.constraintlayout.widget.ConstraintLayout>

2.1 GuideLine辅助线

首先看布局中的guideLine控件:这个控件是不显示在界面上的,也不占用任何空间,主要用于辅助线,它分水平和垂直辅助线,上面布局就是垂直辅助线,我们看看预览效果

可以看到预览效果中在屏幕0.8宽度上有一条垂直辅助线,他可以作为左右两边控件的约束条件.因此guideline可以简单理解为:不显示,不占空间的一条辅助约束其他控件的线。

2.2 Layer控件

说到这个控件我就不得不提一下:在不知道这个辅助控件之前,我的xml布局还是一层套一层,为什么呐?因为我要给某几个控件设置一个背景色。相当于要管理几个子view,果断只有选择在外面包裹一层cons。我也多次在网上找了下资料是在无从下手,group也不行。就在最近在研究flow时突然看到这个控件,omg突然发现新大陆。layer就是层布局,他的作用感觉可以理解为帧布局。

看下xml中这段布局

<androidx.constraintlayout.helper.widget.Layer
    android:id="@+id/layer"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="#D16D6D"
    app:constraint_referenced_ids="textview1,textview2,src"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/textview1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:text="这是一个constrainlayout自带的流式布局Flow"
    android:textColor="@color/white"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@id/guideline"
    app:layout_constraintTop_toTopOf="parent" />


<TextView
    android:id="@+id/textview2"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:text="这是一个constraintlayout自带的Layer层布局"
    android:textColor="@color/white"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@id/guideline"
    app:layout_constraintTop_toBottomOf="@id/textview1" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.8" />

<ImageView
    android:id="@+id/src"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:src="@mipmap/ic_launcher"
    app:layout_constraintBottom_toBottomOf="@id/textview2"
    app:layout_constraintLeft_toRightOf="@id/guideline"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="@id/textview1" />

需要给管理的子控件id设置上使用app:constraint_referenced_ids,使用相当简单,另外建议把layer写在管理的子布局前面不然设置的背景可能无效,至于为什么你可以理解为帧布局,layer写在后面就会把子view覆盖无法正常显示.这样就解决了给多个子控件设置背景又套一层。不过这个控件我还没用到项目上,只是有写demo实例。

2.3 flow控件

这个控件就是我们说的流式布局,在以往我们现实这种效果需要自定义管理器,view或者第三方框架。目前google在cons中已经开源了flow控件。使用也相对简单:

<?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:layout_width="match_parent"
    android:layout_height="wrap_content"

    >


    <androidx.constraintlayout.helper.widget.Layer
        android:layout_width="match_parent"
        android:layout_height="match_parent"


        app:constraint_referenced_ids="tv_device_name,tv_online_state,tv_switch_state2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_device_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="1"
        android:padding="5dp"
        android:text="测试测试"
        android:textColor="@color/purple_200"
        android:textStyle="bold"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_org_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="研发部dadfad打发士大夫打发范德萨"
        android:textColor="@color/purple_700"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/guideline"
        app:layout_constraintTop_toBottomOf="@id/tv_device_name" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.3" />

    <!--        //chain或者aligned,chain:链形式,依次挨着排,aligned会两端对齐-->
    <!--        flow_firstHorizontalStyle首行的对齐方式,packed:靠最左侧挨着排,水平间隔:horizontalGap生-->

    <!--        app:flow_horizontalBias="0" 全局水平bias,为0时,每行都贴左边,可解决中间行单独占一行时,不贴最左侧的问题-->
    <!--        flow_horizontalGap  控件水平方向上的间隔-->
    <androidx.constraintlayout.helper.widget.Flow
        android:id="@+id/flow"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="5dp"
        android:layout_marginEnd="5dp"

        app:constraint_referenced_ids="tv_type,tv_online_state,tv_switch_state,tv_switch_state2,tv_switch_state3,tv_switch_state4,tv_switch_state5"
        app:flow_firstHorizontalBias="0"
        app:flow_firstHorizontalStyle="packed"

        app:flow_horizontalGap="10dp"
        app:flow_horizontalStyle="spread_inside"
        app:flow_lastHorizontalBias="0"
        app:flow_lastHorizontalStyle="packed"
        app:flow_verticalGap="8dp"

        app:flow_wrapMode="chain"
        app:layout_constraintLeft_toRightOf="@id/guideline"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/tv_org_name" />

    <TextView
        android:id="@+id/tv_type"
        android:layout_width="0dp"
        android:layout_height="wrap_content"


        android:text="自动采集看接口接gfgg"
        android:textColor="@color/black"
        app:layout_constraintWidth_default="wrap"

        />

    <TextView
        android:id="@+id/tv_online_state"
        android:layout_width="0dp"
        android:layout_height="wrap_content"

        android:text="在线"
        android:textColor="@color/black"
        app:layout_constraintWidth_default="wrap"

        />

    <TextView
        android:id="@+id/tv_switch_state"
        android:layout_width="0dp"
        android:layout_height="wrap_content"

        android:text="合位"
        android:textColor="@color/black"
        app:layout_constraintWidth_default="wrap" />

    <TextView
        android:id="@+id/tv_switch_state2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"

        android:text="的反馈进度"

        android:textColor="@color/black"
        app:layout_constraintWidth_default="wrap" />


    <TextView
        android:id="@+id/tv_switch_state3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"


        android:text="的反馈进"
        android:textColor="@color/black"
        app:layout_constraintWidth_default="wrap" />

    <TextView
        android:id="@+id/tv_switch_state4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"


        android:text="的反馈进度接口"
        android:textColor="@color/black"
        app:layout_constraintWidth_default="wrap" />

    <TextView
        android:id="@+id/tv_switch_state5"
        android:layout_width="0dp"
        android:layout_height="wrap_content"


        android:text="的反馈进度接口"
        android:textColor="@color/black"
        app:layout_constraintWidth_default="wrap" />
</androidx.constraintlayout.widget.ConstraintLayout>

效果图

这个控件属性较多,理解起来不难,主要是应用场景:1.列表 2.历史搜索

列表里面比较简单直接在item里面对需要自动换行的控件设置id,类似上面的布局。

第二种历史搜索我们模拟一个list<String>的集合,控件进行动态生成(flow部分):

<androidx.constraintlayout.helper.widget.Flow
    android:id="@+id/demo_flow"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:flow_firstHorizontalBias="0"
    app:flow_firstHorizontalStyle="packed"
    app:flow_horizontalBias="0"
    app:flow_horizontalGap="10dp"
    app:flow_horizontalStyle="spread_inside"
    app:flow_lastHorizontalBias="0"
    app:flow_lastHorizontalStyle="packed"
    app:flow_verticalGap="8dp"
    app:flow_wrapMode="chain"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/textview2" />

可以看到在flow布局中并没有设置ids,因此在我们页面中需要动态添加才能生效,下面给出java代码:

stringList.add("哈哈哈大打瞌睡");
stringList.add("阿萨第三方收费");
stringList.add("收到反馈的弗兰克");
stringList.add("世界杯加到快及点击");
stringList.add("大幅度发");
stringList.add("反反复复的付过付过滚滚滚");
stringList.add("哦单开反馈几点开奖辅助");
stringList.add("电饭锅热豆浆大富科技的");
stringList.add("如反馈及风科技风科技的”");
stringList.add("放入局大富科技风科技局非共和国和");
        int ids[] = new int[stringList.size()];
        int localis[] = new int[]{R.id.tvUserCode, R.id.tvUserName, R.id.tvTestDate, R.id.tvHumidity, R.id.tvPercent, R.id.tvCircle, R.id.tvTestSkin, R.id.tvHirstory, R.id.tva, R.id.tvb, R.id.tvc
                , R.id.tvd
                , R.id.tve, R.id.tvf};
        for (int index = 0; index < stringList.size(); index++) {
            TextView textView = new TextView(this);
            ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT);
           layoutParams.matchConstraintDefaultWidth=ConstraintLayout.LayoutParams.WRAP_CONTENT;
            textView.setLayoutParams(layoutParams);
            textView.setId(localis[index]);
//            textView.setGravity(Gravity.START);
//            textView.setTextSize(16.0f);
            textView.setTextColor(getResources().getColor(R.color.black));
            textView.setText(stringList.get(index));
            cons.addView(textView);
            ids[index] = localis[index];
            textView.setOnClickListener(v -> {
                Log.e("您点击了", textView.getText().toString());
                Toast.makeText(MainActivity.this, "您点击了" + textView.getText(), Toast.LENGTH_SHORT).show();
            });
        }
flow.setReferencedIds(ids);

这里面重点就是setReferencedIds设置控件的id,需要传一个int[].这样我们就可以动态实现自动换行了,跟记录历史搜索功能类似,搜索内容进行自动换行。看下效果图

 

重点是中间部分,他实现了自动换行功能。因此在项目中我们需要自动换行时可以选择此控件实现,不需要接住第三方或者自定义。

2.4 group控件

这个辅助控件目前个人觉得功能比较单一就是分组管理,同样需要设置控件id对其进行统一管理,他与flow不同的是不能设置背景,一般是用于对其控件gone visiable的。这里就不单独贴出布局了。

总结:约束布局的其他辅助控件就不列出了,总之功能比较强大的,我们平时在项目中可能使用得不多,导致我们忽略了这个控件的优势,因此这些辅助控件还是值得大家学习,特别是layer能够统一设置控件背景。可以减少避免不必要的布局层次。

 

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种亮红色染料AF 594 NHS Ester|295348-87-7|AF 594 Succinimidyl Ester

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; CAS号&#xff1a;295348-87-7 中文名&#xff1a;AF 594活性酯 英文名&#xff1a;AF 594 Succinimidyl Ester&#xff0c;Alexa Fluor 594 NHS Ester&#xff0c;AF 594 NHS Ester 光谱图&#xff08;Sp…

低代码助力生产管理:ERP生产管理系统

随着国内生产技术的迅速发展&#xff0c;企业信息化实现了生产经营活动的运营自动化、管理网络化和决策智能化。其中运营自动化是基础&#xff0c;决策智能化是顶峰。将信息化应用于生产管理有助于提高产品的质量和生产效率&#xff0c;加强对原材料、生产工序、员工、设备和产…

第三十九篇 自定义指令 - directive

前面讲了关于在Vue中如何来进行封装swiper组件的内容&#xff0c;本篇内容讲到使自定义组件&#xff0c;讲这块内容也是同样为了后续再次回顾封装swiper组件变化做铺垫内容&#xff0c;那么什么是自定义指令&#xff0c;在前面的内容讲过了好些常用的指令&#xff0c;如 v-modl…

记录--两行CSS让页面提升了近7倍渲染性能!

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 对于前端人员来讲&#xff0c;最令人头疼的应该就是页面性能了&#xff0c;当用户在访问一个页面时&#xff0c;总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢&#xff0c;你…

衡师11月月赛web题目wp

目录 1.丢三落四的学姐 2.wep&#xff1f;Pwn&#xff01;&#xff01;&#xff01; 这题web部分是buuctf中的DASCTF X GFCTF 2022十月挑战赛&#xff01;的原题 1.丢三落四的学姐 访问题目位置&#xff0c;很明显的phpstudy搭建的痕迹 访问一下经常信息泄露的几个文件&…

Redis与数据库的爱恨纠葛

Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 早期数据库只要有数据库的操作---增--删--改--查 当用户量特别多的情况下&#xff0c;数据库的数量一定是跟不上用户的数量&#xff0c;对数据库来说是特别繁忙的 看着每天都累趴下…

String_JavaScript

String_JavaScript 学习路线&#xff1a;JavaScript基础语法&#xff08;输出语句&#xff09;->JavaScript基础语法&#xff08;变量&#xff09;->JavaScript基础语法&#xff08;数据类型&#xff09;->JavaScript基础语法&#xff08;运算符&#xff09;->Jav…

海外推广运营的技巧汇总

海外电商运营推广&#xff1f;做海外电商&#xff0c;重点在于运营推广。如果运营推广能做好&#xff0c;那么在行业内分一杯羹并不难。但问题是&#xff0c;在运营推广上&#xff0c;很难做海外电商。 这年头&#xff0c;相信大家都知道海外电商出问题了。很多人的账号都被亚…

动态链接库dll详解

动态链接库概述 DLL就是整个Windows操作系统的基础。动态链接库不能直接运行&#xff0c;也不能接收消息他们是一些独立的文件。 Windows API中的所有函数都包含在DLL中。 其中有三个最重要的DLL kernel32.dll&#xff0c;它包含用于管理内存、线程和进程的各个函数&#xff1b…

[附源码]SSM计算机毕业设计学生实习管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

超详细的商业智能BI知识分享,值得收藏

在数据为王的时代&#xff0c;获取数据和处理数据&#xff0c;成为企业必备的生存手段。哪个企业能在数据信息中汲取到更多的有效价值&#xff0c;就能抢占先机&#xff0c;获得市场的主动权。数据分析将不再是专业技术人员或数据分析师的专利&#xff0c;商业智能 BI 可以帮助…

华为机试 - 最大股票收益

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 假设知道某段连续时间内股票价格&#xff0c;计算通过买入卖出可获得的最大收益。 输入一个大小为 n 的数 price(p1,p2,p3,p4…….pn),pi 是第i天的股票价格。 pi 的格式为股票价格(非负整型)加上货…

基于风控特征相关度,挖掘贷中等场景中的存量客户价值|来看看相关实操

在数据建模流程中&#xff0c;都会涉及一个样本特征的相关性的分析&#xff0c;这个是建模流程中重要一环。通过量化特征字段之间的相关程度&#xff0c;可以将其作为一个重要信息维度&#xff0c;便于我们对模型训练的特征变量池进行有效筛选&#xff0c;不仅有简化模型且保证…

NLTK下载使用问题

一开始想要执行如下语句&#xff0c;结果运行不了 from textblob import TextBlob text Today is a beautiful day. Tomorrow looks like bad weather. blob TextBlob(text) print(blob) print(-*10) print(blob.sentences)原因是没有下载NLTK的语料库&#xff0c;调用如下语…

【创建VUE3新项目】从零开始如何创建一个干净的vue3项目【基于前端详细介绍】

【写在前面】基于安装完node和npm基础上来实现的&#xff0c;没安装的可以看我之前的文章&#xff0c;如何验证呢&#xff1f;npm -v / node -v 两个命令行解决&#xff01; 一、创建文件&#xff08;脚手架安装&#xff09; 此处值得注意的是不能包括大写字母&#xff0c;不…

图库 | 图计算的适用场景有哪些?

图计算适用的场景非常广泛。在其肇始的早期阶段&#xff0c;图计算仅限于学术界以及工业界资深的研究机构内部&#xff0c;随着计算机体系架构的发展&#xff0c;图计算也在更广泛的行业和场景中得到应用。按照时间维度我们大体可以把图计算的发展及适用范围分为如下几个阶段&a…

微服务框架 SpringCloud微服务架构 5 Nacos 5.1 认识和安装Nacos

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构5 Nacos5.1 认识和安装Nacos5.1.1 认识Nacos5.1.2 安装Nacos5 Nacos 5.1 …

ARM架构与编程 · 基于IMX6ULL

一、嵌入式系统硬件介绍 cpu RAM&#xff08;内存&#xff09; FALSH 集成&#xff08;flash存储设备&#xff09; MCU/单片机 AP/ MPU 进化之后可以外接内存和存储设备,跑复杂的操作系统&#xff0c;比如手机 cpu一上电就会执行程序&#xff0c;程序存放在片内的ROM中&…

Apollo 应用与源码分析:Monitor监控-软件监控-时间延迟监控

目录 代码 分析 RunOnce 函数分析 UpdateState函数分析 发送时间延迟报告函数分析 备注 代码 class LatencyMonitor : public RecurrentRunner {public:LatencyMonitor();void RunOnce(const double current_time) override;bool GetFrequency(const std::string& ch…

原型设计模式

一、原型模式 1、定义 原型模式&#xff08;Prototype Pattern&#xff09;指原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象&#xff0c;属于创建型设计模式。 原型模式的核心在于复制原型对象。 2、结构 &#xff08;1&#xff09;模式的结构 …