安卓约束性布局学习

据说这个布局是为了解决各种布局过度前套导致代码复杂的问题的。

我想按照自己想实现的各种效果来逐步学习,那么直接拿微信主页来练手,用约束性布局实现微信首页吧。

先上图

先实现顶部搜索框+加号按钮

先实现 在布局中添加一个组件,然后摆放到屏幕的任意位置!!!!!!

1、放个文本标签TextView在布局组开始的位置:

<?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="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.ConstraintLayout>

效果:

要理解这句代码:

app:layout_constraintTop_toTopOf="parent"

只要理解了这句话,你就一定可以很自信的往下学习了,这句代码的意思:

子控件的顶部与父容器的顶部对齐

理解了上面这句代码,那么后面的那句:

app:layout_constraintLeft_toLeftOf="parent"

很显然就是:子控件本身的左边与父容器的左边对其。

那么我们好奇,假如是控件与控件之间是不是也可以用这种办法呢?

那么我们实践一下,我们在控件下方新增一个控件,那么代码是不是应该是

新控件的顶部和控件的底部对其,然后新控件的左边和控件的左边对其,我们试试:

<?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="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"tools:ignore="HardcodedText" /><TextViewandroid:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toBottomOf="@id/textView1"app:layout_constraintLeft_toLeftOf="@id/textView1"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"tools:ignore="HardcodedText" /><TextViewandroid:layout_width="100dp"android:layout_height="60dp"android:background="#F44336"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toBottomOf="@id/textView1"app:layout_constraintLeft_toLeftOf="@id/textView1"android:layout_marginBottom="40dp"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.ConstraintLayout>

看看效果:

捂脸....没用!!那两句限制住了!这就是约束性布局啊,牛!

再想想:

要两个控件相交,我们拖动试试代码是啥!!

哈哈哈,拖动没办法让他们相交,哈哈哈哈哈哈,笑死了。

看看AI怎么说:

<androidx.constraintlayout.widget.ConstraintLayoutxmlns: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=".MainActivity"><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="First TextView"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"android:padding="16dp" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button Overlapping"app:layout_constraintTop_toTopOf="@id/textView1"app:layout_constraintStart_toStartOf="@id/textView1"android:padding="16dp" /></androidx.constraintlayout.widget.ConstraintLayout>

试试Ai的代码:可以!!还是那两句起的作用,就是新控件跑到控件内部去了(相对于约束),然后用外边距调整相交的位置就ok了。

以上看完希望你能很清楚的了解约束性布局的基本用法。

上面我们实现了将一个控件放置在开始位置,那加入放在开始位置的往后移动一段距离呢?

刚好,用控件的外边距:

<?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="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_marginLeft="60dp"android:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.ConstraintLayout>

嘿嘿,这张图看得出来吗,不是模拟器,是design 视图,这样省时间!!!

同样的,我们要实现控件在顶部下方一丢丢呢,那就:

<?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="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_marginTop="60dp"android:layout_marginLeft="60dp"android:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView1"android:layout_width="100dp"android:layout_height="60dp"android:background="#D6E1AA"android:text="textview1"android:textColor="@color/black"android:textSize="25sp"android:textStyle="bold"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintRight_toRightOf="parent"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.ConstraintLayout>

真的真的!!!,看效果:

不错不错,学会了好多,基本就这样了呗,咱们学会了!!快去动手实践吧!!!

学会的点个赞???哈哈哈哈哈哈,下课!!!

等一下,忘了实现微信首页了,😂。

来,上图:

step 1:实现顶部搜索框 和 加号按钮:

这部分看似简单,其实一点也不难!!!!😄

上代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns: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:paddingRight="20dp"android:paddingLeft="20dp"android:paddingTop="20dp"android:layout_height="match_parent"tools:context=".MainActivity"><EditTextandroid:drawableStart="@drawable/search"  android:paddingStart="16dp" android:id="@+id/input"android:layout_width="0dp"android:layout_height="55dp"android:hint="搜索"android:inputType="text"android:background="@drawable/rounded_edittext"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toStartOf="@+id/button"app:layout_constraintWidth_percent="0.8"tools:ignore="MissingConstraints" /><androidx.appcompat.widget.LinearLayoutCompatandroid:id="@+id/button"android:layout_width="55dp"android:layout_height="55dp"android:background="@drawable/rounded_edittext"android:gravity="center"app:layout_constraintTop_toTopOf="@id/input"app:layout_constraintStart_toEndOf="@id/input"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintWidth_percent="0.2"tools:ignore="MissingConstraints"><ImageButtonandroid:background="@color/my_gray"android:src="@drawable/add"android:layout_width="48dp"android:layout_height="48dp"/></androidx.appcompat.widget.LinearLayoutCompat></androidx.constraintlayout.widget.ConstraintLayout>

看效果:

下面的就是聊天列表了,我们来实现一个item就行了,关于列表怎么实现今天就不学了。


这个看似简单,其实一点也不难:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns: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:paddingRight="20dp"android:paddingLeft="20dp"android:paddingTop="20dp"android:layout_height="match_parent"tools:context=".MainActivity"><EditTextandroid:drawableStart="@drawable/search"android:paddingStart="16dp"android:id="@+id/input"android:layout_width="0dp"android:layout_height="55dp"android:hint="搜索"android:inputType="text"android:background="@drawable/rounded_edittext"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toStartOf="@+id/button"app:layout_constraintWidth_percent="0.8"tools:ignore="MissingConstraints" /><androidx.appcompat.widget.LinearLayoutCompatandroid:id="@+id/button"android:layout_width="55dp"android:layout_height="55dp"android:background="@drawable/rounded_edittext"android:gravity="center"app:layout_constraintTop_toTopOf="@id/input"app:layout_constraintStart_toEndOf="@id/input"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintWidth_percent="0.2"tools:ignore="MissingConstraints"><ImageButtonandroid:background="@color/my_gray"android:src="@drawable/add"android:layout_width="48dp"android:layout_height="48dp"/></androidx.appcompat.widget.LinearLayoutCompat><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_marginTop="20dp"android:layout_height="80dp"android:background="@color/my_gray"app:layout_constraintTop_toBottomOf="@+id/input"app:layout_constraintLeft_toLeftOf="@id/input"><!--头像--><ImageViewandroid:id="@+id/head_image"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:src="@drawable/head_image"android:layout_width="60dp"android:layout_height="60dp"/><!--昵称--><TextViewandroid:id="@+id/nickname"app:layout_constraintLeft_toRightOf="@+id/head_image"android:layout_width="wrap_content"android:text="王"android:textColor="@color/black"android:textSize="20sp"android:layout_marginLeft="10dp"app:layout_constraintTop_toTopOf="@+id/head_image"android:layout_height="wrap_content"/><!--聊天记录--><TextViewapp:layout_constraintLeft_toRightOf="@+id/head_image"android:layout_width="wrap_content"android:text="老王在干嘛呢?"android:layout_marginLeft="10dp"app:layout_constraintBottom_toBottomOf="@id/head_image"android:layout_height="wrap_content"/><!--时间--><TextViewandroid:layout_marginTop="10dp"app:layout_constraintTop_toTopOf="parent"app:layout_constraintRight_toRightOf="parent"android:text="2024-06-07"android:layout_marginRight="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></androidx.constraintlayout.widget.ConstraintLayout></androidx.constraintlayout.widget.ConstraintLayout>

ok,结束,这么带劲的文章怎么也得有10个赞吧?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java】速度搭建一个springboot项目

使用软件&#xff1a;IDEA&#xff0c;mysql 使用框架&#xff1a;springboot mybatis-plus druid 坑点 使用IDEA搭建一个springboot项目的时候&#xff0c;需要考虑一下IDEA版本支持的JDK版本以及maven版本。否则再构建项目&#xff0c;引入pom的时候就会报错。 需要检查…

PostgreSQL基础(十):PostgreSQL的并发问题

文章目录 PostgreSQL的并发问题 一、事务的隔离级别 二、MVCC PostgreSQL的并发问题 一、事务的隔离级别 在不考虑隔离性的前提下&#xff0c;事务的并发可能会出现的问题&#xff1a; 脏读&#xff1a;读到了其他事务未提交的数据。&#xff08;必须避免这种情况&#xf…

docker命令 docker ps -l (latest)命令在 Docker 中用于列出最近一次创建的容器

文章目录 12345 1 docker ps -l 命令在 Docker 中用于列出最近一次创建的容器。具体来说&#xff1a; docker ps&#xff1a;这个命令用于列出当前正在运行的容器。-l 或 --latest&#xff1a;这个选项告诉 docker ps 命令只显示最近一次创建的容器&#xff0c;不论该容器当前…

OpenAI发表研究论文 介绍了一种逆向工程AI模型工作原理的方法

ChatGPT 开发商 OpenAI 构建人工智能的方法本周遭到了前员工的抨击&#xff0c;他们指责该公司利用可能有害的技术冒不必要的风险。今天&#xff0c;OpenAI 发布了一篇新的研究论文&#xff0c;目的显然是为了表明它在通过提高模型的可解释性来应对人工智能风险方面的认真态度。…

计算机组成原理(一)

冯诺依曼机器的特征&#xff1a; 指令和数据以同等的地位存储在存储器当中指令和数据都是二进制指令和数据都是保存在存储器当中的 存储字 每个存储单元中的数据&#xff0c;称为存储字 存储字长 存储单元能够存储的二进制数据的长度 在一个8位系统中&#xff0c;字长是…

【C++进阶】深入STL之list:模拟实现深入理解List与迭代器

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;初步了解 list &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之list &#x1f4d2;1. list…

计算机的存储规则

计算机中的数据只有三类&#xff1a;Text 文本&#xff0c;Image 图片&#xff0c;Sound 声音。 文本包括数字、字母和汉字等。 视频是图片和声音的组合。 在计算机中&#xff0c;任何数据都是以二进制的形式来存储的。 数字的存储&#xff1a;转换为二进制进行存储。 字符…

[线程与网络] 网络编程与通信原理(六):深入理解应用层http与https协议(网络编程与通信原理完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

【Java面试】九、微服务篇-SpringCloud(上)

文章目录 1、SpringCloud五大组件2、服务注册和发现2.1 Eurake2.2 Eurake和Nacos的区别 3、Ribbon负载均衡3.1 策略3.2 自定义负载均衡策略 4、服务雪崩与熔断降级4.1 服务雪崩4.2 服务降级4.3 服务熔断 5、服务限流5.1 Nginx限流5.2 网关限流 6、微服务监控7、面试 1、SpringC…

qq号码采集软件

寅甲QQ号码采集软件, 一款采集QQ号、QQ邮件地址&#xff0c;采集QQ群成员、QQ好友的软件。可以按关键词采集&#xff0c;如可以按地区、年龄、血型、生日、职业等采集。采集速度非常快且操作很简单。

【TIPs】 Visual Stadio 2019 中本地误使用“git的重置 - 删除更改 -- hard”后,如何恢复?

环境&#xff1a; VS 2019Windows10本地版本管理&#xff08;非远程&#xff09; 前言&#xff1a; git 在Visual Stadio 2019中集成了git的版本管理&#xff0c;在本地用来做版本管理&#xff0c;本来比较好用。 不过有一次&#xff0c;由于拿最初始的版本的时候&#xf…

C++教程(003):运算符

3 运算符 作用&#xff1a;用于执行代码的运算 我们主要讲解以下运算符&#xff1a; 运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较运算符用于表达式的比较&#xff0c;并返回一个真值或假值逻辑运算符用于根据表达式的值返回真值或假值 …

swaggerHole:针对swaggerHub的公共API安全扫描工具

关于swaggerHole swaggerHole是一款针对swaggerHub的API安全扫描工具&#xff0c;该工具基于纯Python 3开发&#xff0c;可以帮助广大研究人员检索swaggerHub上公共API的相关敏感信息&#xff0c;整个任务过程均以自动化形式实现&#xff0c;且具备多线程特性和管道模式。 工具…

TCP攻击是怎么实现的,如何防御?

TCP&#xff08;Transmission Control Protocol&#xff09;是互联网协议族中的重要组成部分&#xff0c;用于在不可靠的网络上提供可靠的数据传输服务。然而&#xff0c;TCP协议的一些特性也使其成为攻击者的目标&#xff0c;尤其是DDoS&#xff08;Distributed Denial of Ser…

解决方案:昇腾aarch64服务器安装CUDA+GCC+CMake,编译安装Pytorch,华为昇腾HPC服务器深度学习环境安装全流程

目录 一、安装CUDA和cudnn1.1、下载CUDA驱动1.2、安装CUDA驱动1.3、配置环境变量1.4、安装cudnn1.5、安装magma-cuda 二、安装gcc编译器三、安装CMake四、安装NCCL五、编译安装Pytorch5.1、前提准备5.2、下载pytorch源码5.3、配置环境变量5.4、Pytorch编译安装5.5、测试Pytorch…

mysql中 redo日志(下)

大家好。上篇文章我们介绍了什么是redo日志以及redo日志的写入过程。建议没看过上篇文章的同学先看一下《mysql那些事儿》之 redo日志&#xff08;上&#xff09;&#xff0c;今天我们继续来说一说redo日志。 一、redo日志文件 1. redo日志刷盘时机 我们知道mtr运行过程中产…

这才是计科之 Onix XV6 源码分析(3、Unix-like系统的进程调度模块)

这才是计科之 Onix & XV6 源码分析&#xff08;3、Unix-like系统的进程调度模块&#xff09; 前言 前面已经分析了XV6的启动流程以及内存管理&#xff0c;接下来&#xff0c;我们探究进程调度的实现。与其说进程调度&#xff0c;我觉得可以顺应内存的虚拟化的叫法&#x…

禁用layui树形表格的多选框checkbox

1. 背景 在使用树形表格渲染数据时&#xff0c;需要对数据进行批量操作。相对于选中数据后&#xff0c;再做错误提示。直接把数据的多选框禁用掉更加直观。 2. 实现 DisabledTableCheckBox: () > {// 获取所有行 var tableElem $(".layui-table-fixed-l");var …

ALSA 用例配置

ALSA 用例配置。参考 ALSA 用例配置 来了解更详细信息。 ALSA 用例配置 用例配置文件使用 配置文件 语法来定义静态配置树。该树在运行时根据配置树中的条件和动态变量进行评估&#xff08;修改&#xff09;。使用 用例接口 API 解析结果并将其导出到应用程序。 配置目录和主…

【Git】如何不管本地文件,强制git pull

要在 Git 中强制执行 git pull 操作&#xff0c;忽略本地文件的更改&#xff0c;可以按照以下步骤操作&#xff1a; 保存当前工作状态&#xff1a;如果你有未提交的更改&#xff0c;可以使用 git stash 将这些更改存储起来。 git stash强制拉取最新代码&#xff1a;使用 git re…