关于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.mzph.cn/bicheng/62690.shtml

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

相关文章

《数字图像处理基础》学习07-图像几何变换之最近邻插值法放大图像

目录 一,概念 二,题目及matlab实现 1,解题思路 2,matlab实现 1)matlab思路 2)完整代码 三,放大图像及matlab实现 一,概念 通过上一篇,我已经学习了使用最邻近插…

计网-子网划分

基于本视频观看做的笔记,帮助自己理解 子网掩码:用于识别IP地址中的网络号和主机号的位数 表示方法 第一种.32位二进制数字,在子网掩码中,网络号用”1“表示,主机号用”0“表示 e.g.:IP地址1.1.1.1的子网掩码是255…

【Solidity】入门指南:智能合约开发基础

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Solidity入门指南:智能合约开发基础引言1. 开发环境搭建1.1 Remix I…

如何高效地架构一个Java项目

引言 Java是企业级应用开发的主流语言之一,而我们作为使用Java语言的程序员,职称有初级、中级、高级、资深、经理、架构,但我们往往只是慢慢通过经验的积累迭代了自己的等级,如果没有保持学习的习惯,大多数程序员会停留…

HTTP 探秘之旅:从入门到未来

文章目录 导言:目录:第一篇:HTTP,互联网的“快递员”第二篇:从点开网页到看到内容,HTTP 究竟做了什么?第三篇:HTTP 的烦恼与进化史第四篇:HTTP 的铠甲——HTTPS 的故事第…

c++:thread(线程)

1.基本使用 1.1创建线程 join()函数用于&#xff1a;主程序等待子线程执行完毕之后再继续 #include <iostream> #include <thread>void printHello() {std::cout << "hello world" << std::endl; }int main() {// 1.创建线程std::thread …

第六届金盾信安杯-SSRF

操作内容&#xff1a; 进入环境 可以查询网站信息 查询环境url https://114.55.67.167:52263/flag.php 返回 flag 就在这 https://114.55.67.167:52263/flag.php 把这个转换成短连接&#xff0c;然后再提交 得出 flag

SpringMVC(2)

前言 这一节我们终结springmvc 1. SSM整合配置 先导入坐标 先创建包 配置类 然后开始创建jdbc的config和mybatis的config&#xff0c;还有properties SpringConfig&#xff1a; jdbc.properties&#xff1a; JdbcConfig: MybatisConfig: 下面开始spring整合mvc&#…

零基础Python学习

1.环境搭建 1.1 安装运行环境python3.13 Welcome to Python.org 1.2 安装集成开发环境PyCharm PyCharm: the Python IDE for data science and web development 1.3 创建项目 && 设置字体 2.基础语法 2.1 常量与表达式 在python中整数除整数不会优化&#xff0c;所…

vue3项目创建方式记录

目录 创建vue3常用的方式有三种&#xff1a;一.使用vue cli创建二.使用vite创建三.使用vue3官方推荐创建方式&#xff08;create-vue&#xff09; 创建vue3常用的方式有三种&#xff1a; 一.使用vue cli创建 vue create 项目名二.使用vite创建 vite是下一代前端开发与构建工…

用MATLAB符号工具建立机器人的动力学模型

目录 介绍代码功能演示拉格朗日方法回顾求解符号表达式数值求解 介绍 开发机器人过程中经常需要用牛顿-拉格朗日法建立机器人的动力学模型&#xff0c;表示为二阶微分方程组。本文以一个二杆系统为例&#xff0c;介绍如何用MATLAB符号工具得到微分方程表达式&#xff0c;只需要…

SpringAi整合大模型(进阶版)

进阶版是在基础的对话版之上进行新增功能。 如果还没弄出基础版的&#xff0c;请参考 https://blog.csdn.net/weixin_54925172/article/details/144143523?sharetypeblogdetail&sharerId144143523&sharereferPC&sharesourceweixin_54925172&spm1011.2480.30…

Android电视项目焦点跨层级流转

1. 背景 在智家电视项目中&#xff0c;主要操作方式不是触摸&#xff0c;而是遥控器&#xff0c;通过Focus进行移动&#xff0c;确定点击进行的交互&#xff0c;所以在电视项目中焦点、选中、确定、返回这几个交互比较重要。由于电视屏比较大&#xff0c;在一些复杂页面中会存…

yolo辅助我们健身锻炼

使用软件辅助健身能够大大提升运动效果并帮助你更轻松地达成健身目标。确保每次锻炼都更加高效且针对性强,精确记录你的训练进度,帮助你更清晰地看到自己的进步,避免无效训练。 借助YOLO11的尖端计算机视觉技术,跟踪和分析锻炼变得异常简单。它可以无缝检测和监控多种锻炼…

Flume 与 Kafka 整合实战

目录 一、Kafka 作为 Source【数据进入到kafka中&#xff0c;抽取出来】 &#xff08;一&#xff09;环境准备与配置文件创建 &#xff08;二&#xff09;创建主题 &#xff08;三&#xff09;测试步骤 二、Kafka 作为 Sink数据从别的地方抽取到kafka里面】 &#xff08;…

SRS搭建直播推流服务

学习链接 5分钟教你搭建SRS流媒体服务器 - B站视频 SRS Stack 入门B站合集视频 - SRS官方教程 SRS官网 SRS官网文档 ossrs/srs github SRS for window - 可以安装windows版本的srs&#xff0c;SRS 5.0.89正式支持Windows&#xff0c;每个5.0的版本都会提供安装包 文章目录…

css—轮播图实现

一、背景 最近和朋友在一起讨论的时候&#xff0c;我们提出了这样的一个提问&#xff0c;难道轮播图的效果只能通过js来实现吗&#xff1f;经过我们的一系列的争论&#xff0c;发现了这是可以通过纯css来实现这一效果的&#xff0c;CSS轮播图也是一种常见的网页展示方式&#x…

nacos安装部署

nacos安装部署 1.安装nacos 1.安装nacos nacos的安装很简单下载后解压启动即可&#xff0c;但是在启动前请确保jdk环境正常&#xff1b; 1.首先我们要下载nacos安装包&#xff1a;可以到官网下载&#xff0c;注意我这里使用的是2.1.0版本&#xff1b; 2.下载完成后&#xff0…

tomcat 8.5.35安装及配置

安装包地址&#xff1a; 1.Index of /dist/tomcat/tomcat-8/v8.5.35/binhttps://archive.apache.org/dist/tomcat/tomcat-8/v8.5.35/bin/ 2.通过网盘分享的文件&#xff1a;tomcat 链接: https://pan.baidu.com/s/1z9bD4rIuIRvzQ4okm3iRzw?pwdp24p 提取码: p24p 3.通过官网…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第12篇:YOLOv9——可编程梯度信息(PGI)+广义高效层聚合网络(GELAN)】

YOLOv9 1 摘要2 改进点3 网络架构 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇&#xff1a;YOLO系列论文、代码和主要优缺点汇总】【第3篇&#xff1a;YOLOv1——YOLO的开山之作】【第4篇&#xff1a;YOLOv2—…