关于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 的故事第…

前端处理sql参数替换问题,即使有重复参数,也可以按顺序替换

我们可以创建一个通用的模板函数,能够处理任意SQL语句中的占位符替换。这个函数将接受两个参数: sqlTemplate:包含占位符的SQL模板字符串。params:一个对象数组,每个对象包含name和value,用于替换SQL模板中的占位符。通用模板函数 function replaceSqlPlaceholders(sqlT…

Fabric.js 中文文档

Fabric.js 中文文档 基于canvas画布的实用类Fabric.js的使用 4、Fabric.js 常用的方法&事件 Fabric.js 画布 defaultCursor 属性(1) 官网文档地址:http://fabricjs.com/docs/github 地址:https://github.com/fabricjs/fabric.js Demo地址&#x…

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

Spark优化--开发调优、资源调优、数据倾斜调优和shuffle调优等

针对Spark优化&#xff0c;我们可以从多个角度进行&#xff0c;包括开发调优、资源调优、数据倾斜调优和shuffle调优等。以下是一些具体的优化方法&#xff1a; 1. 开发调优 避免创建重复的RDD&#xff1a;对于同一份数据&#xff0c;只应该创建一个RDD&#xff0c;避免创建多…

PHP和GD库如何调整图片尺寸

PHP和GD库可以通过一系列函数调整图片的尺寸。以下是一个详细的步骤说明&#xff1a; 一、准备工作 检查GD库是否安装&#xff1a; 使用命令php -i | grep -i gd来检查GD库是否已经安装。如果返回类似于“GD Support > enabled”的内容&#xff0c;则表示安装成功。如果没有…

递归算法讲解(c基础)

递归的定义 递归是指在函数的定义中使用函数自身的方法。它是一种解决问题的策略&#xff0c;将一个大型复杂的问题逐步分解为规模更小的、与原问题相似的子问题来解决。当子问题的规模足够小&#xff0c;达到一个可以直接求解的基本情况&#xff08;也称为终止条件&#xff09…

有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。-多语言

目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目&#xff1a;有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的规律将它插入数组中。 程序分析&#xff1a;首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移…

SpringMVC(2)

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

颜色分类

颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数…

零基础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是下一代前端开发与构建工…

【无标题】JAVA策略模式代码例子

在Java中&#xff0c;您可以使用面向对象编程中的继承和多态性来实现您的需求。首先&#xff0c;我们定义一个Good类&#xff0c;该类包含满减策略和打折策略。然后&#xff0c;我们可以让Shoe类和Cloth类继承自Good类。为了实现不同的折扣或满减策略&#xff0c;可以考虑使用策…

cocos creator 触摸事件官方案例

cocos creator 触摸事件官方案例 1、官方示例&#xff1b; 2、对官方示例的总结&#xff1a; &#xff08;1&#xff09;介绍了鼠标事件和触摸事件的类型&#xff0c;这里主要关注的是在移动端和PC端都可以触发的触摸事件。 &#xff08;2&#xff09;节点事件的派发&#…

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

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