安卓约束性布局学习

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

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

先上图

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

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

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.mzph.cn/news/849865.shtml

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

相关文章

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具&#xff0c;您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

软件测试--Linux快速入门

文章目录 软件测试-需要掌握的Linux指令Linux命令操作技巧Linx命令的基本组成常用命令 软件测试-需要掌握的Linux指令 Linux命令操作技巧 使用Tab键自动补全上下键进行翻找之前输入的命令命令执行后无法停止使用CtrC,结束屏幕输出 Linx命令的基本组成 命令 [-选项] [参数] …

CANopen for Python

系列文章目录 前言 该软件包支持与 CANopen 节点网络交互。 注意 这里的大部分文档都是从 CANopen 维基百科页面上直接盗用的。 本文档正在编写中。欢迎反馈和修改&#xff01; CANopen 是用于自动化领域嵌入式系统的通信协议和设备配置文件规范。根据 OSI 模型&#x…

【Java】解决Java报错:ConcurrentModificationException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 遍历过程中修改集合2.2 使用 Iterator 进行删除操作 3. 解决方案3.1 使用 Iterator 的 remove 方法3.2 使用 CopyOnWriteArrayList3.3 使用 synchronized 块 4. 预防措施4.1 使用线程安全的集合类4.2 使用合适的遍历和修改方法4.…

如何在没有密码的情况下解锁iPhone

通常&#xff0c;您可以使用密码、FaceID 或 Touch ID 轻松解锁 iPhone。但是&#xff0c;有时您可能会忘记密码、iPhone 已停用或您的二手手机已锁定。在这种情况下&#xff0c;您必须绕过 iPhone 密码才能访问您的设备。在本文中&#xff0c;我们将向您介绍 5 种经过测试的方…

【多模态/CV】图像数据增强数据分析和处理

note 多模态大模型训练前&#xff0c;图片数据处理的常见操作&#xff1a;分辨率调整、网格畸变、水平翻转、分辨率调整、随机crop、换颜色、多张图片拼接、相似图片检测并去重等 一、分辨率调整 from PIL import Image def resize_image(original_image_path, save_image_p…

mysql 8 linux7,8安装教程

选择自己对应的linux版本 cat /etc/os-release //查看自己linux系统版本 1.mysql下载地址 MySQL :: Download MySQL Community Server (Archived Versions) 拉到下面找到 选择自己linux指定的版本&#xff0c;否则会很麻烦 cat /etc/os-release //查看系统版本 2.查…

50etf期权怎么开户?期权懂有几种方式?

今天带你了解50etf期权怎么开户&#xff1f;期权懂有几种方式&#xff1f;50ETF期权开户可以通过证券公司、期权交易平台或期权交易应用进行。投资者需填写开户申请表格&#xff0c;提供身份证明和其他资料&#xff0c;完成开户手续。 50etf期权怎么开户&#xff1f; 满足资金…

欢乐钓鱼大师辅助:哪家云手机自动钓鱼更好操作!

在探索《欢乐钓鱼大师》的世界时&#xff0c;我们不得不提到一个强大的游戏辅助工具——VMOS云手机。通过VMOS云手机&#xff0c;你可以轻松实现自动钓鱼&#xff0c;让游戏体验更加便捷高效。 什么是VMOS云手机&#xff1f; VMOS云手机是一款基于虚拟机技术的云端工具&#…

ubuntu20.04中设置包含ros节点的文件自启动

若文件里包含了ros话题的发布和接收&#xff0c;那么设置自启动时&#xff0c;应该首先将roscore设置为自启动。 首先确保roscore有一个systemd服务文件。如果还没有&#xff0c;需要在/etc/systemd/system/下创建一个。例如&#xff0c;一个基本的roscore.service文件可能如下…

安徽代理记账公司的专业服务和创新理念

在当今竞争激烈的市场环境中&#xff0c;为了提升企业的运营效率&#xff0c;许多企业开始寻找专业的代理记账公司进行财务管理和记账&#xff0c;本文将介绍一家名为安徽代理记账公司的专业服务和创新理念。 安徽代理记账公司是一家专注于为企业提供全方位会计服务的公司&…

SwiftUI中Mask修饰符的理解与使用

Mask是一种用于控制图形元素可见性的图形技术&#xff0c;使用给定视图的alpha通道掩码该视图。在SwiftUI中&#xff0c;它类似于创建一个只显示视图的特定部分的模板。 Mask修饰符的定义&#xff1a; func mask<Mask>(alignment: Alignment .center,ViewBuilder _ ma…

大屏可视化建设方案(word)

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.…

9.1 Go 接口的定义

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

算法训练营day03--203.移除链表元素+707.设计链表+206.反转链表

一、203.移除链表元素 题目链接&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/ 文章讲解&#xff1a;https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html 视频讲解&#xff1a;https://www.bilibili.com…

Python报错:IndentationError: unexpected indent问题的解决办法及原因

解决Python报错&#xff1a;IndentationError: unexpected indent问题的解决办法及原因 Python是一种注重可读性的编程语言&#xff0c;它使用缩进来定义代码块。如果你遇到了IndentationError: unexpected indent的错误&#xff0c;这意味着Python解释器在代码中遇到了意外的缩…

阿里云(域名解析) certbot 证书配置

1、安装 certbot ubuntu 系统&#xff1a; sudo apt install certbot 2、申请certbot 域名证书&#xff0c;如申请二级域名aa.example.com 的ssl证书&#xff0c;同时需要让 bb.aa.example.com 也可以使用此证书 1、命令&#xff1a;sudo certbot certonly -d “域名” -d “…

使用亮数据代理IP爬取PubMed文章链接和邮箱地址

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

排查互联网敏感信息,对信息泄露说“不”

前言 01 近几年&#xff0c;随着我国对网络安全的重视&#xff0c;贴近实战的攻防演练活动越发丰富&#xff0c;各单位的网络安全建设也逐步从“事后补救”升级为“事前防控”。在演练中&#xff0c;进攻方会在指定时间内对防守方发动网络攻击&#xff0c;检测出防守方存在的…

04 架构核心技术之分布式消息队列

本课时的主题是分布式消息队列&#xff0c;分布式消息队列的知识结构如下图。 本课时主要介绍以下内容。 同步架构和异步架构的区别。异步架构的主要组成部分&#xff1a;消息生产者、消息消费者、分布式消息队列。异步架构的两种主要模型&#xff1a;点对点模型和发布订阅模型…