关于ConstarintLayout有关的点

目录

一、概述

二、过程。

1、介绍

主要特点

关键概念

使用示例

总结

2、我遇到的问题

问题:

可能的原因:

结论


一、概述

        在学习过程中,发现对ConstarintLayout理解不够到位,下面是发现并解决问题过程。

二、过程。

1、介绍

ConstraintLayout 是 Android Jetpack 中的一种布局管理器,旨在提供更灵活和高效的用户界面设计。它允许开发者使用约束(constraints)来定义视图之间的关系,而不是依赖于嵌套布局。这种方式可以显著减少层级,提高性能。

主要特点

  1. 灵活的布局:

    • 通过定义视图之间的约束关系,开发者可以轻松地实现复杂的布局,而无需使用多个嵌套的布局。
  2. 性能优化:

    • ConstraintLayout 减少了视图层级,使得布局的渲染更加高效,从而提高应用的性能。
  3. 丰富的布局功能:

    • 提供了多种功能,如链(Chains)、指导线(Guidelines)、比率(Bias)等,帮助创建响应式设计。
  4. 支持动画:

    • 可以与 MotionLayout 一起使用,实现复杂的动画效果。

关键概念

  • 约束(Constraints):

    • 用于定义视图相对于其他视图或父容器的边界关系。例如,可以将一个视图的左边界约束到另一个视图的右边界。
  • 指导线(Guidelines):

    • 虚拟线可以用于帮助放置和对齐视图。可以是水平或垂直的,开发者可以指定其位置(如 0.5f 表示中间)。
  • 链(Chains):

    • 允许多个视图在同一方向上进行排列。可以设置链的样式(如均匀分布、拉伸等)。
  • 偏移量(Bias):

    • 允许在约束中对视图进行细微调整,例如将视图稍微偏移到某一侧。

使用示例

以下是一个简单的 ConstraintLayout 示例:

@Composable
fun SimpleConstraintLayout() {ConstraintLayout(modifier = Modifier.fillMaxSize()) {val (textView, button) = createRefs()Text(text = "Hello, ConstraintLayout!",modifier = Modifier.constrainAs(textView) {top.linkTo(parent.top, margin = 16.dp)start.linkTo(parent.start, margin = 16.dp)})Button(onClick = { /* Do something */ },modifier = Modifier.constrainAs(button) {top.linkTo(textView.bottom, margin = 16.dp)end.linkTo(parent.end, margin = 16.dp)}) {Text("Click Me")}}
}

总结

ConstraintLayout 是构建灵活、响应式 Android 应用界面的强大工具。通过使用约束、指导线和链等功能,开发者可以高效地设计复杂布局并优化应用性能。

2、我遇到的问题

问题:

在学习时,我的代码及运行结果如下:

@Preview
@Composable
fun DrawerHead(){ConstraintLayout(modifier = Modifier.width(300.dp).height(200.dp).background(Color.Yellow)) {val (imgRef,titleRef,contentRef) = remember{createRefs()}createVerticalChain(titleRef,contentRef, chainStyle = ChainStyle.Spread)val hGuideline = createGuidelineFromStart(0.2f)val vGuideline = createGuidelineFromTop(0.5f)Image(painter = painterResource(id= android.R.mipmap.sym_def_app_icon),contentDescription = "image", modifier = Modifier.constrainAs(imgRef){top.linkTo(parent.top)bottom.linkTo(parent.bottom)start.linkTo(parent.start)end.linkTo(hGuideline)})//Text("客人", fontSize = 20.sp,)}}

主要是水平线的这一行,控制图标位于容器的哪个位置。

val hGuideline = createGuidelineFromStart(0.2f)

我在学习时误以为是控制黄色区域大小,(但其实那个外部容器早就在

modifier = Modifier.width(300.dp).height(200.dp)

时定义了),发现感觉大小不对,于是将

val hGuideline = createGuidelineFromStart(0.2f)

参数改成0.5f,结果如下。

一开始我还没看出变化,后面才发现是图标位置。

但是奇怪的是,0.5f在理解中应该是位于容器居中,但上面的位置反而像0.2f 的,百思不得其解,我又试了一下1.0f,结果如下:

这回倒是居中了。我想那大于1.0的可以吗?我在搜查资料时都表示不可以,但是实践出真知。下面是2.0f参数的结果:


好家伙!2.0f才到最边上,这才是1.0f的效果啊按理来说。

于是我开始思考。

可能的原因:

  1. 布局方向:

    • 如果你的容器是垂直方向的,1.0f 通常会表示底部边缘,而 0.5f 才是中间。因此,如果你看到 1.0f 在中间,可能是因为布局的逻辑或方向与预期不符。
  2. 指南线的定义:

    • 在某些布局框架中,1.0f 可能被解释为“完全填充”或“最大位置”,因此可能导致它在视觉上看起来居中。
  3. 布局的高度或宽度:

    • 如果容器的高度或宽度设置不当(例如为零或非常小),可能导致指南线的位置看起来相对不正常。
  4. 父容器的影响:

    • 如果指南线的父容器有额外的属性(如填充、边距等),这也可能影响指南线的实际位置。

而在你的 DrawerHead 组件中,Image 的位置是由以下几个因素决定的:

  1. 水平指南线 (hGuideline):

    val hGuideline = createGuidelineFromStart(1.0f)
    

    这里的 1.0f 表示指南线位于容器的最右侧(100%),这意味着图像的结束边缘将与容器的右边缘对齐。因此,Image 的右边界会靠近容器的右侧。

  2. 约束设置:

    Modifier.constrainAs(imgRef) {top.linkTo(parent.top)bottom.linkTo(parent.bottom)start.linkTo(parent.start)end.linkTo(hGuideline)
    }
    

    这里你将 Image 的左边界(start)链接到容器的左边界,而右边界(end)链接到 hGuideline。这意味着图像的左边缘在容器的左边缘,而右边缘在容器的右边缘。

  3. 高度和垂直链:

    • 你使用了 createVerticalChain(titleRef, contentRef, chainStyle = ChainStyle.Spread),这意味着 titleRefcontentRef 的位置会根据其内容和父容器的高度进行分布,但这与 Image 的水平位置无关。

结论

由于 hGuideline 的位置在容器的最右侧,而 Image 的左边界在容器的最左侧,因此 Image 会填满整个宽度(300.dp),使得它看起来在水平上居中。

所以是因为我同时定义了start和end位置,所以两个都会有影响。

那最后我注释掉部分代码,结果就如预期一样了。

@Preview
@Composable
fun DrawerHead(){ConstraintLayout(modifier = Modifier.width(300.dp).height(200.dp).background(Color.Yellow)) {val (imgRef,titleRef,contentRef) = remember{createRefs()}createVerticalChain(titleRef,contentRef, chainStyle = ChainStyle.Spread)val hGuideline = createGuidelineFromStart(0.5f)val vGuideline = createGuidelineFromTop(0.5f)Image(painter = painterResource(id= android.R.mipmap.sym_def_app_icon),contentDescription = "image", modifier = Modifier.constrainAs(imgRef){top.linkTo(parent.top)bottom.linkTo(parent.bottom)//start.linkTo(parent.start)end.linkTo(hGuideline)})//Text("客人", fontSize = 20.sp,)}}

结果:

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

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

相关文章

【UE5 C++课程系列笔记】06——定时器的基本使用

目标 使用定时器每秒调用函数打印一句日志信息,并在调用一定次数后停止定时器。 步骤 1. 新建一个Actor类,这里命名为 2. 先在“TimerActor.cpp”中获取定时器管理器 使用定时器管理器来设置定时器,该定时器在2s后启动,然后每…

用c语言完成俄罗斯方块小游戏

用c语言完成俄罗斯方块小游戏 这估计是你在编程学习过程中的第一个小游戏开发,怎么说呢,在这里只针对刚学程序设计的学生,就是说刚接触C语言没多久,有一点功底的学生看看,简陋的代码,简陋的实现&#xff0…

iQOO Neo10系列携三大蓝科技亮相,性能与续航全面升级

11月29日,iQOO Neo10系列正式登场。作为iQOO Neo系列的最新力作,Neo10系列不仅延续了该系列一贯的“双芯”特色,更在性能、续航、屏幕、影像等多个方面实现了全面升级,为用户带来前所未有的使用体验。此次发布的Neo10系列共有两款…

springboot信息化在线教学平台的设计与实现(代码+数据库+LW)

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足,创建了一个计算机管理信息化在线教学平台的方案。文章介绍了信息化在线教…

DataX实战|使用Python 构建简易的DataX数据血缘工具(一)

导读: 在这篇文章中,我介绍了如何使用 Python 构建简易的 DataX 数据血缘工具,以便解决 DataXWeb 在查询表上下游关系时的不足。 选择 Flask 作为框架,利用 DataXWeb 的元数据 job_info 表和 job_json,通过 JSON 解析…

Android 14之HIDL转AIDL通信

Android 14之HIDL转AIDL通信 1、interface接口1.1 接口变更1.2 生成hidl2aidl工具1.3 执行hidl2aidl指令1.4 修改aidl的Android.bp文件1.5 创建路径1.6 拷贝生成的aidl到1和current1.7 更新与冻结版本1.8 编译模块接口 2、服务端代码适配hal代码修改2.1 修改Android.bp的hidl依…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展,而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 (PCB) 的检测和分析。本文…

基于树莓派的安保巡逻机器人--项目介绍

目录 一、项目简介 二、项目背景 三、作品研发技术方案 作品主要内容: 方案的科学性 设计的合理性 四、作品创新性及特点 五、作品自我评价 本篇为项目“基于树莓派的安保巡逻机器人”介绍博客 演示视频链接: 基于树莓派的安保巡逻机器人_音游…

多点DMALL启动招股:将在港交所上市,聚焦数字零售服务

近日,多点数智有限公司(Dmall Inc.,下称“多点”或“多点DMALL”)发布全球发售文件,于11月28日至12月3日招股,预计将于2024年12月6日在港交所主板挂牌上市。 招股书显示,多点DMALL本次全球发售的…

挑战用React封装100个组件【007】

项目地址 https://github.com/hismeyy/react-component-100 组件描述 今天的组件是用来展示聊天列表,或者论坛内容列表的组件。配合挑战006的时候开发的组件,可以显示用户的具体信息。 样式展示 前置依赖 今天,我分享的组件,需…

汉字Unicode编码相互转换API集成指南

汉字Unicode编码相互转换API集成指南 引言 在国际化的背景下,字符编码的统一变得尤为重要。Unicode作为一种通用字符集标准,能够支持全球几乎所有的语言文字,包括复杂的汉字系统。对于开发人员来说,掌握如何在不同的编码格式之间…

[Linux] 进程间通信——匿名管道命名管道

标题:[Linux] 进程间通信——匿名管道&&命名管道 水墨不写bug (图片来源于网络) 目录 一、进程间通信 二、进程间通信的方案——匿名管道 (1)匿名管道的原理 (2)使用匿名管道 三、进…

一体化数据安全平台uDSP 入选【年度创新安全产品 TOP10】榜单

近日,由 FreeBuf 主办的 FCIS 2024 网络安全创新大会在上海隆重举行。大会现场揭晓了第十届 WitAwards 中国网络安全行业年度评选获奖名单,该评选自 2015 年举办以来一直饱受赞誉,备受关注,评选旨在以最专业的角度和最公正的态度&…

pycharm链接neo4j(导入文件)

1.新建csv文件 2.写入文件 3.运行代码 import csv from py2neo import Graph, Node, Relationship# 连接到Neo4j数据库,使用Bolt协议 graph Graph("bolt://localhost:7687", auth("neo4j", "password"))# 读取CSV文件 with open(…

vscode ctrl+/注释不了css

方式一.全部禁用插件排查问题. 方式二.打开首选项的json文件,注释掉setting.json,排查是哪一行配置有问题. 我的最终问题:需要将 "*.vue": "vue",改成"*.vue": "html", "files.associations": { // "*.vue": &qu…

TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络

本篇是关于3次握手和四次挥手的详细解释~ 如果对你有帮助,请点个免费的赞吧,谢谢汪。(点个关注也可以!) 如果以下内容需要补充和修改,请大家在评论区多多交流~。 目录 1. TCP头部: 2. 三次握手…

单片机学习笔记 15. 串口通信(理论)

更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

C#中switch语句使用

编写一个程序,使用switch语句将用户输入的分数转换成等级,如表 private static void Main(string[] args) { Console.WriteLine("请输入分数:"); int score int.Parse(Console.ReadLine()); switch (score) …

[网络安全]sqli-labs Less-5 解题详析

[网络安全]Less-5 GET - Double Injection - Single quotes - String:双注入GET单引号字符型注入 判断注入类型判断注入点个数查库名(爆破) left函数抓包查库名(双查询注入) 原理实例查库名(extractvalue函数&#xff…

pyspark实现基于协同过滤的电影推荐系统

最近在学一门大数据的课,课程要求很开放,任意做一个大数据相关的项目即可,不知道为什么我就想到推荐算法,一直到着手要做之前还没有新的更好的来代替,那就这个吧。 推荐算法 推荐算法的发展由来已久,但和…