当前位置: 首页 > news >正文

【Compose multiplatform教程17】【组件】BoxWithConstraints组件

查看全部组件 icon-default.png?t=O83Ahttps://blog.csdn.net/b275518834/article/details/144751353

BoxWithConstraints

功能说明:它是 Jetpack Compose 中的关键布局组件,能够精准捕捉自身所在容器的尺寸约束信息,通过获取最大宽度和最大高度这两个关键属性,为开发者开启一扇通往自适应布局世界的大门。开发者得以依据这些尺寸数据,灵动地调整内部子组件的布局策略、样式呈现乃至显示逻辑。无论是在屏幕尺寸多变的移动设备上,还是应对不同分辨率的桌面端,都能确保界面元素有条不紊地排列,合理利用每一寸空间,实现从紧凑小屏到宽敞大屏的完美适配。

示例场景:以一款阅读类应用为例,当用户在手机上打开书籍详情页面时,BoxWithConstraints 可以根据屏幕的实际宽度,判断若宽度较窄,就将书籍封面图片、书名、作者等信息纵向排列,确保文字清晰可读,各元素不拥挤;而当应用运行在平板等大屏设备上,一旦检测到较大的 maxWidth 和 maxHeight,便可将封面图片放大置于左侧,书名、作者、简介等信息以合适的字体和间距横向排列在右侧,充分利用大屏优势,提升视觉体验。再如在社交分享界面,若 maxWidth 有限,分享按钮与取消按钮会紧凑排列在底部,文案区域自适应变窄;若处于宽屏状态,按钮间距拉大,文案区域舒展,还可适时展示相关的热门话题标签,让分享功能更加醒目、易用,完美契合不同设备形态下的用户需求。

package org.lxz.project.compose.demoimport androidx.compose.foundation.layout.*
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
object BoxWithConstraintsDemo {private val elementPadding: Dp = 8.dp@Composablefun boxWithConstraintsExample() {// 使用BoxWithConstraints组件作为外层容器,使其占满可用空间BoxWithConstraints(modifier = Modifier.fillMaxSize()) {// 获取BoxWithConstraints组件所在容器的最大可用宽度val maxWidth = this.maxWidth// 获取BoxWithConstraints组件所在容器的最大可用高度val maxHeight = this.maxHeight// 展示获取到的最大宽度和最大高度信息(可以用于调试或者根据其做进一步决策)Text(text = "Max Width: ${maxWidth.value} dp, Max Height: ${maxHeight.value} dp",modifier = Modifier.padding(16.dp).offset(y = 15.dp))// 根据宽高比来决定采用水平排列还是垂直排列布局方式if (maxWidth > maxHeight) {// 宽度大于高度,采用水平排列(Row)布局Row(modifier = Modifier// 让Row组件占满整个可用空间.fillMaxSize()// 设置子组件在水平方向上的内边距为16.dp,使布局看起来更美观.padding(horizontal = 16.dp),horizontalArrangement = Arrangement.SpaceEvenly) {// 第一个子组件,宽度占比可根据需求调整,这里示例设为总宽度的1/3Text(text = "Left Text",modifier = Modifier.width(maxWidth / 3).padding(elementPadding))// 第二个子组件,占剩余宽度空间,通过weight实现按比例分配空间Column(modifier = Modifier// 设置权重为1f,表示占剩余的水平空间比例.weight(1f)// 让Column组件在垂直方向上占满可用空间.fillMaxHeight().padding(elementPadding)) {Text(text = "Top Text in Middle Column", modifier = Modifier.padding(elementPadding))Button(onClick = { /* 处理按钮点击事件 */ },modifier = Modifier.padding(elementPadding)) {Text(text = "Click Me", modifier = Modifier.padding(elementPadding))}Text(text = "Bottom Text in Middle Column", modifier = Modifier.padding(elementPadding))}// 第三个子组件,宽度同样占总宽度的1/3Text(text = "Right Text",modifier = Modifier.width(maxWidth / 3).padding(elementPadding))}} else {// 高度大于宽度,采用垂直排列(Column)布局Column(modifier = Modifier// 让Column组件占满整个可用空间.fillMaxSize()// 设置子组件在垂直方向上的内边距为16.dp,使布局更美观.padding(vertical = 16.dp),verticalArrangement = Arrangement.SpaceEvenly) {// 第一个子组件,高度占比可根据需求调整,这里示例设为总高度的1/3Text(text = "Top Text",modifier = Modifier.height(maxHeight / 3).padding(elementPadding))// 第二个子组件,占剩余高度空间,通过weight实现按比例分配空间Row(modifier = Modifier// 设置权重为1f,表示占剩余的垂直空间比例.weight(1f)// 让Row组件在水平方向上占满可用空间.fillMaxWidth().padding(elementPadding)) {Text(text = "Left Text in Middle Row", modifier = Modifier.padding(elementPadding))Button(onClick = { /* 处理按钮点击事件 */ },modifier = Modifier.padding(elementPadding)) {Text(text = "Click Me", modifier = Modifier.padding(elementPadding))}Text(text = "Right Text in Middle Row", modifier = Modifier.padding(elementPadding))}// 第三个子组件,高度同样占总高度的1/3Text(text = "Bottom Text",modifier = Modifier.height(maxHeight / 3).padding(elementPadding))}}}}
}

运行效果

  1. 整体布局结构
    外层使用 BoxWithConstraints 组件作为基础容器,通过 Modifier.fillMaxSize 使其占满整个可用空间,以便能获取到最外层的尺寸约束信息(maxWidth 和 maxHeight)。

  2. 获取并利用尺寸约束信息
    首先获取了 maxWidth 和 maxHeight,并通过一个简单的 Text 组件展示了这两个尺寸值(同时利用 Modifier.offset 对其在垂直方向做了一点偏移,使其布局更美观)。然后依据 maxWidth 和 maxHeight 的大小比较结果,选择不同的内部布局方式。

  3. 不同布局方式下的子组件处理

    • 水平排列(Row 布局)情况
      • 当宽度大于高度时,使用 Row 组件水平排列子组件,通过 horizontalArrangement = Arrangement.SpaceEvenly 让子组件在水平方向均匀分布,同时利用 Modifier.width 为部分子组件设置特定的宽度占比(如设置第一个和第三个 Text 组件宽度为总宽度的 1/3),中间的 Column 组件通过 Modifier.weight(1f) 占剩余的宽度空间,并且在每个子组件上都添加了 elementPadding 的内边距,保证元素之间有合适间距,避免堆叠。
    • 垂直排列(Column 布局)情况
      • 类似地,当高度大于宽度时,采用 Column 组件垂直排列子组件,通过 verticalArrangement = Arrangement.SpaceEvenly 使子组件在垂直方向均匀分布,利用 Modifier.height 设定部分子组件的高度占比(如设置第一个和第三个 Text 组件高度为总高度的 1/3),中间的 Row 组件通过 Modifier.weight(1f) 占剩余的高度空间,同样为每个子组件添加 elementPadding 的内边距确保布局清晰。

相关文章:

【Compose multiplatform教程17】【组件】BoxWithConstraints组件

查看全部组件 https://blog.csdn.net/b275518834/article/details/144751353 BoxWithConstraints 功能说明:它是 Jetpack Compose 中的关键布局组件,能够精准捕捉自身所在容器的尺寸约束信息,通过获取最大宽度和最大高度这两个关键属性&…...

银河麒麟操作系统安装达梦数据库(超详细)

目录 引言1. 前期准备1.1 安装麒麟系统1.2 下载达梦数据库安装包(DM8)1.3 上传安装包到麒麟系统1.4 挂载安装包(iso)文件1.5 配置安装用户和组1.6 创建安装路径及修改权限1.7 设置临时安装目录 2. 安装达梦数据库(DM8&…...

Spring源码_05_IOC容器启动细节

前面几章,大致讲了Spring的IOC容器的大致过程和原理,以及重要的容器和beanFactory的继承关系,为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的,接下来的每一章都是从总体脉络中, 去研究之前没看的一些重要…...

科大讯飞在线语音合成(流式版)python版

1、进入自己的项目 复制APPID、APISecret、APIKey 2、添加好听发音人 复制vcn参数 3、需要替换代码部分: 换自己喜欢的发声人的参数 换上自己的APPID、APISecret、APIKey 4、完整代码: # -*- coding:utf-8 -*- import _thread as thread import base…...

常见搜索算法汇总

常见搜索算法总结 搜索算法是人工智能和计算机科学中用于解决问题、优化路径或发现数据模式的关键技术。本文将对常见的搜索算法进行总结,包括A*算法、D*算法、模拟退火(Simulated Annealing)、爬山法(Hill Climbing)、…...

vue 中 ref 详解

一、定义与基本用法 1. 定义 在 Vue.js 中,ref是一个用于在组件中获取 DOM 元素或者子组件实例引用的属性。它提供了一种直接访问元素或组件的方式,使得我们可以在 JavaScript 代码中对它们进行操作。 2. 基本使用 在模板中,可以通过给元…...

探索开源项目 kernel:技术的基石与无限可能

在开源的广袤世界中,有一颗璀璨的明星——kernel(https://gitee.com/openeuler/kernel),它宛如一座技术的宝藏,蕴含着无数的智慧与创新,为众多开发者所瞩目和敬仰。 一、初窥 kernel 项目 当我第一次接触…...

C 实现植物大战僵尸(二)

C 实现植物大战僵尸(二) 前文链接,C 实现植物大战僵尸(一) 五 制作启动菜单 启动菜单函数 void startUI() {IMAGE imageBg, imgMenu1, imgMenu2;loadimage(&imageBg, "res/menu.png");loadimage(&am…...

Vivado - TCL 命令(DPU脚本、v++命令、impl策略)

目录 1. 简介 2. TCL 示例 2.1 DPU TCL 脚本 2.1.1 源码-精简 2.1.2 依赖关系 2.1.3 查 v 步骤列表 2.1.4 生成 DPU.XO 2.2 CPU 示例 2.2.1 源码-框架 2.2.2 示例设计详解 2.3 创建运行脚本 2.3.1 Generate scripts 2.3.2 runme.sh 文件 2.3.3 design_1_wrapper…...

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言🌍 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术🍁3.1关键特性🍁3.2配置选项🍁3.3使用示例 ❄️4. 连接池之Druid技术🍁 4.1主要特性🍁 4.2 配置选项…...

hadoop-common的下载位置分享

1.GitHub - steveloughran/winutils: Windows binaries for Hadoop versions (built from the git commit ID used for the ASF relase) 2.GitHub - cdarlint/winutils: winutils.exe hadoop.dll and hdfs.dll binaries for hadoop windows 3.winutils: hadoop winutils 镜像...

【机器学习】SVM支持向量机(一)

介绍 支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 的核心思想是通过找到一个最优的超平面来划分不同类别的数据点,并且尽可能地最大化离该超平面最近的数据点(支持向量…...

Spring Boot介绍、入门案例、环境准备、POM文件解读

文章目录 1.Spring Boot(脚手架)2.微服务3.环境准备3.1创建SpringBoot项目3.2导入SpringBoot相关依赖3.3编写一个主程序;启动Spring Boot应用3.4编写相关的Controller、Service3.5运行主程序测试3.6简化部署 4.Hello World探究4.1POM文件4.1.1父项目4.1.2父项目的父…...

基于Spring Boot + Vue3实现的在线商品竞拍管理系统源码+文档

前言 基于Spring Boot Vue3实现的在线商品竞拍管理系统是一种现代化的前后端分离架构的应用程序,它结合了Java后端框架Spring Boot和JavaScript前端框架Vue.js的最新版本(Vue 3)。该系统允许用户在线参与商品竞拍,并提供管理后台…...

LeetCode--排序算法(堆排序、归并排序、快速排序)

排序算法 归并排序算法思路代码时间复杂度 堆排序什么是堆?如何维护堆?如何建堆?堆排序时间复杂度 快速排序算法思想代码时间复杂度 归并排序 算法思路 归并排序算法有两个基本的操作,一个是分,也就是把原数组划分成…...

华诺星空 Java 开发工程师笔试题 - 解析

单选题 1.Math.round(-11.5)等于多少?(B) A.-11.5 B.-11 C.-12 D.11.5 2.下列哪个没有继承自Collection接口。( C ) A.List B.Set C.Map D.全部 3.下列说法正确的有(B) A.在类方法中可用this来调用本类的类方法 B.在类方法中调用本类的类方法时可直接调用 C.在类…...

QT:一个TCP客户端自动连接的测试模型

版本 1:没有取消按钮 测试效果: 缺陷: 无法手动停止 测试代码 CMakeLists.txt cmake_minimum_required(VERSION 3.19) project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup(…...

关于启动vue项目,出现:Error [ERR_MODULE_NOT_FOUND]: Cannot find module ‘xxx‘此类错误

目录 一、问题报错 二、原因分析 三、解决方法 一、问题报错 node环境变量配置有问题: (base) xxxM73H-15:~/VueProject/pproject-vue$ npm run dev /usr/bin/env: “node”: 没有那个文件或目录vue项目启动有问题: (base) xxx:~/VueProject/pproj…...

电路元件与电路基本定理

电流、电压和电功率 电流 1 定义: 带电质点的有序运动形成电流 。 单位时间内通过导体横截面的电量定义为电流强度, 简称电流,用符号 i 表示,其数学表达式为:(i单位:安培(A&#x…...

指针之矢:C 语言内存幽境的精准飞梭

一、内存和编码 指针理解的2个要点: 指针是内存中一个最小单元的编号,也就是地址平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量 总结:指针就是地址,口语中说的指针通常指的是指针变量。…...

实时手机检测-通用部署成本分析:A10/A100/T4显卡性价比实测对比

实时手机检测-通用部署成本分析:A10/A100/T4显卡性价比实测对比 1. 项目背景与需求场景 在现代计算机视觉应用中,实时手机检测是一个具有广泛实用价值的技术方向。从智能监控系统中的打电话行为识别,到零售行业的商品展示分析,再…...

多模态扩展:OpenClaw结合Qwen3.5-4B-Claude处理截图信息

多模态扩展:OpenClaw结合Qwen3.5-4B-Claude处理截图信息 1. 为什么需要多模态能力 作为一个长期依赖文本交互的技术爱好者,我最初对OpenClaw的理解停留在"能通过自然语言控制电脑的AI助手"层面。直到上个月需要处理大量产品截图中的文字信息…...

Youtu-Parsing快速部署指南:一键启动Web服务,开箱即用解析工具

Youtu-Parsing快速部署指南:一键启动Web服务,开箱即用解析工具 1. 项目概述与核心价值 Youtu-Parsing是腾讯优图实验室推出的多模态文档智能解析模型,基于Youtu-LLM-2B构建,专为解决复杂文档解析难题而设计。不同于传统OCR工具&…...

【20年Cython+PyO3专家亲授】:绕过GIL的Python扩展中87%并发崩溃的底层内存模型误用解析

第一章:Python无锁GIL环境下的并发模型报错解决方法Python 的全局解释器锁(GIL)本质上限制了多线程在 CPU 密集型任务中的真正并行性。然而,随着 PyPy、Jython、Cython 以及实验性无 GIL CPython 分支(如 PEP 703 提案…...

CentOS虚拟机启动卡在紧急模式?别慌,手把手教你用xfs_repair修复XFS元数据损坏

CentOS虚拟机启动卡在紧急模式?手把手教你用xfs_repair拯救XFS元数据 当你正准备开始一天的工作,突然发现CentOS虚拟机无法正常启动,屏幕上赫然显示着"emergency mode"的红色警告。这种突如其来的系统崩溃,往往让运维人…...

揭秘LLM System Prompt的逆向工程:从API调试到Prompt Injection实战

1. 什么是System Prompt? 当你和ChatGPT聊天时,有没有好奇过它为什么总是用特定的语气回答?比如你问"今天天气怎么样",它可能会说"根据我的知识库,天气信息需要实时查询..."而不是直接报个假数据。…...

LangFlow实战案例:如何用拖拽方式搭建智能写作助手

LangFlow实战案例:如何用拖拽方式搭建智能写作助手 1. 引言:为什么选择LangFlow 在AI技术快速发展的今天,大语言模型已经展现出强大的文本生成能力。然而,对于大多数非技术背景的内容创作者来说,直接调用API或编写复…...

CatBoost实战指南:从算法原理到工业级应用优化

1. CatBoost为什么成为工业界的宠儿? 第一次接触CatBoost是在处理一个电商用户行为预测项目时。当时数据集里充斥着用户ID、商品类别、地域信息这类类别型特征,用XGBoost和LightGBM处理总感觉差点意思。直到尝试了CatBoost,预测效果直接提升了…...

3种文档转换难题的解决方案:Cloud Document Converter工具深度解析

3种文档转换难题的解决方案:Cloud Document Converter工具深度解析 【免费下载链接】cloud-document-converter Convert Lark Doc to Markdown 项目地址: https://gitcode.com/gh_mirrors/cl/cloud-document-converter 核心价值:文档格式转换的效…...

别再只用箱线图了!用Python的PtitPrince库5分钟搞定雨云图,数据分布一目了然

数据可视化新选择:用PtitPrince打造专业级雨云图 在数据分析的世界里,可视化工具的选择往往决定了我们能否准确传达数据背后的故事。传统箱线图虽然简洁,却隐藏了太多细节;提琴图展示了分布形态,却丢失了原始数据点。这…...