鸿蒙UI开发——组件的自适应拉伸

1、概 述

针对常见的开发场景,ArkUI开发框架提供了非常多的自适应布局能力,这些布局可以独立使用,也可多种布局叠加使用。本文针对ArkUI提供的拉伸能力做简单讨论。

拉伸能力是指容器组件尺寸发生变化时,增加或减小的空间全部分配给容器组件内指定区域。效果类似如下:

图片

做过前端开发的朋友应该使用过Flex布局,这是一个非常常用的布局方式,类似的,ArkUI也提供了Flex布局,我们在ArkUI中,可以借助flexGrow和flexShrink属性可以方便地实现自适应拉伸能力。

2、Flex布局实现拉伸能力

拉伸能力通常通过Flex布局中的flexGrow和flexShrink属性实现,flexGrow和flexShrink属性常与flexBasis属性搭配使用,这三个属性介绍如下:

属性

类型

描述

flexGrow

number

默认为:0

仅当父容器宽度大于所有子组件宽度的总和时,该属性生效。配置了此属性的子组件,按照比例拉伸,分配父容器的多余空间。

flexShrink

number

默认为:1

仅当父容器宽度小于所有子组件宽度的总和时,该属性生效。配置了此属性的子组件,按照比例收缩,分配父容器的不足空间。

flexBasis

'auto' | Length

默认为:'auto'

设置组件在Flex容器中主轴方向上基准尺寸。

'auto'意味着使用组件原始的尺寸,不做修改。flexBasis属性不是必须的,通过width或height也可以达到同样的效果。当flexBasis属性与width或height发生冲突时,以flexBasis属性为准。

3、案 例

本示例中的页面由中间的内容区(包含一张图片)以及两侧的留白区组成,各区域的属性配置如下。

  • 中间内容区的宽度设置为100vp,同时将flexGrow属性设置为1,flexShrink属性设置为0。

  • 两侧留白区的宽度设置为100vp,同时将flexGrow属性设置为0,flexShrink属性设置为1。

由上可知,父容器的基准尺寸是300vp(100vp+100vp+100vp)。我们可以通过拖动底部的滑动条改变父容器的尺寸,查看布局变化。

  • 当父容器的尺寸大于300vp时,父容器中多余的空间全部分配给中间内容区。

  • 当父容器的尺寸小于300vp时,左右两侧的留白区按照“1:1”的比例收缩(即平均分配父容器的不足空间)。

效果如下:

图片

代码如下(25、30、34行代码):

@Entry@Componentstruct FlexibleCapabilitySample1 {  @State containerWidth: number = 300  // 底部滑块,可以通过拖拽滑块改变容器尺寸。  @Builder slider() {    Slider({ value: this.containerWidth, min: 100, max: 1000, style: SliderStyle.OutSet })      .blockColor(Color.White)      .width('60%')      .onChange((value: number) => {        this.containerWidth = value;      })      .position({ x: '20%', y: '80%' })  }  build() {    Column() {      Text(`每列初始宽度:100 | 100 | 100`)      Text(`当前容器宽度:${this.containerWidth}`)      Column() {        Row() {          // 通过flexGrow和flexShrink属性,将多余的空间全部分配给图片,将不足的空间全部分配给两侧空白区域。          Row(){            Text('第一个区域')          }.width(100).height(100).backgroundColor(Color.Brown)            .flexGrow(0).flexShrink(1)          Image($r("app.media.background")).width(100).height(100)            .objectFit(ImageFit.Contain)            .backgroundColor(Color.Pink)            .border({width: 1, color: Color.Gray})            .flexGrow(1).flexShrink(0)          Row(){            Text('第二个区域')          }.width(100).height(100).backgroundColor(Color.Orange)            .flexGrow(0).flexShrink(1)        }        .width(this.containerWidth)        .justifyContent(FlexAlign.Center)        .alignItems(VerticalAlign.Center)      }      this.slider()    }    .width('100%')    .height('100%')    .border({      width: 1,      color: Color.Gray    })    .justifyContent(FlexAlign.Center)    .alignItems(HorizontalAlign.Center)  }}

4、one more thing..

如果我们期望将父容器的剩余空间全部分配给某空白区域时,也可以通过Blank组件实现。

📢📢注意:

当仅当父组件为Row\Column\Flex组件时,Blank组件才会生效。

一个通过Blank实现拉伸效果的示例如下:

图片

代码如下(27行代码):​​​​​​​

@Entry@Componentstruct FlexibleCapabilitySample2 {  @State rate: number = 0.8  @State value: boolean = true;  // 底部滑块,可以通过拖拽滑块改变容器尺寸  @Builder slider() {    Slider({ value: this.rate * 100, min: 30, max: 80, style: SliderStyle.OutSet })      .blockColor(Color.White)      .width('60%')      .onChange((value: number) => {        this.rate = value / 100;      })      .position({ x: '20%', y: '80%' })  }  build() {    Column() {      Column() {        Text(`${this.value ? '已加入' : '待加入'}`)        Row() {          Text('Harmony自习室')            .fontSize(16)            .width(140)            .height(22)            .fontWeight(FontWeight.Medium)            .lineHeight(22)          Blank()      // 通过Blank组件实现拉伸能力          Toggle({ type: ToggleType.Switch, isOn: $$this.value })            .width(36)            .height(20)        }        .height(55)        .borderRadius(12)        .padding({ left: 13, right: 13 })        .backgroundColor('#FFFFFF')        .width(this.rate * 100 + '%')      }      this.slider()    }    .width('100%')    .height('100%')    .backgroundColor('#F1F3F5')    .justifyContent(FlexAlign.Center)    .alignItems(HorizontalAlign.Center)  }}

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

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

相关文章

K 值选对,准确率翻倍:KNN 算法调参的黄金法则

目录 一、背景介绍 二、KNN 算法原理 2.1 核心思想 2.2 距离度量方法 2.3 算法流程 2.4算法结构: 三、KNN 算法代码实现 3.1 基于 Scikit-learn 的简单实现 3.2 手动实现 KNN(自定义代码) 四、K 值选择与可视化分析 4.1 K 值对分类…

Azure DevOps Server 2022.2 补丁(Patch 5)

微软Azure DevOps Server的产品组在4月8日发布了2022.2 的第5个补丁。下载路径为:https://aka.ms/devops2022.2patch5 这个补丁的主要功能是修改了代理(Agent)二进制安装文件的下载路径;之前,微软使用这个CND(域名为vstsagentpackage.azuree…

PHP7+MySQL5.6 查立得轻量级公交查询系统

# PHP7MySQL5.6 查立得轻量级公交查询系统 ## 系统简介 本系统是一个基于PHP7和MySQL5.6的轻量级公交查询系统(40KB级),支持线路查询、站点查询和换乘查询功能。系统采用原生PHPMySQL开发,无需第三方框架,适合手机端访问。 首发版本&#x…

Vue-Cropper:全面掌握图片裁剪组件

Vue-Cropper 完全学习指南:Vue图片裁剪组件 🎯 什么是 Vue-Cropper? Vue-Cropper 是一个简单易用的Vue图片裁剪组件,支持Vue2和Vue3。它提供了丰富的配置选项和回调方法,可以满足各种图片裁剪需求。 🌟 …

[Go] Option选项设计模式 — — 编程方式基础入门

[Go] Option选项设计模式 — — 编程方式基础入门 全部代码地址,欢迎⭐️ Github:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-option 1 介绍 在 Go 开发中,我们经常遇到需要处理多参数配置的场景。传统方…

【Unity开发】控制手机移动端的震动

🐾 个人主页 🐾 阿松爱睡觉,横竖醒不来 🏅你可以不屠龙,但不能不磨剑🗡 目录 一、前言二、Unity的Handheld.Vibrate()三、调用Android原生代码四、NiceVibrations插件五、DeviceVibration插件六、控制游戏手…

Linux 软件安装方式全解(适用于 CentOS/RHEL 系统)

🐧 Linux 软件安装方式全解(适用于 CentOS/RHEL 系统) 在 Linux 系统中,软件安装方式丰富多样,常见于以下几种方式: 安装方式命令/工具说明软件包管理器(推荐)yum, dnf, apt, zypp…

前端面试题-HTML篇

1. 请谈谈你对 Web 标准以及 W3C 的理解和认识。 我对 Web 标准 的理解是,它就像是互联网世界的“交通规则”,由 W3C(World Wide Web Consortium,万维网联盟) 这样一个国际性组织制定。这些规则规范了我们在编写 HTML、CSS 和 JavaScript 时应该遵循的语法和行为,比如要…

ERROR: column cl.udt_name does not exist LINE 1 navicat打开金仓表报错

描述: ERROR: column cl.udt_name does not exist LINE 1: …a.columns cl LEFT JOlN pg type ty ON ty.typname cl.udt nam. navicat连上金仓数据库之后,想打开一张表看看,每张表都报这个错,打不开 解决方案: 网上…

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版

1.题目描述 2.思路 方法一: 定义其实坐标,右上角的元素(0,n-1)。进入while循环(注意边界条件,行数小于m,列数要>0)从右上角开始开始向左遍历(比当…

Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程

Jupyter MCP 服务器是基于模型上下文协议(Model Context Protocol, MCP)的 Jupyter 环境扩展组件,它能够实现大型语言模型与实时编码会话的无缝集成。该服务器通过标准化的协议接口,使 AI 模型能够安全地访问和操作 Jupyter 的核心…

MySQL下载安装配置环境变量

MySQL下载安装配置环境变量 文章目录 MySQL下载安装配置环境变量一、安装MySQL1.1 下载1.2 安装 二、查看MySQL服务是否启动三、配置环境变量四、验证 一、安装MySQL 1.1 下载 官网社区版(免费版):https://dev.mysql.com/downloads/mysql/ …

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?

在 WSL 的 Debian 12 系统中安装 curl 非常简单,你可以直接使用 APT 包管理器从官方仓库安装。以下是详细步骤: 1. 更新软件包索引 首先确保系统的包索引是最新的: sudo apt update2. 安装 curl 执行以下命令安装 curl: sudo…

Linux入门(十四)rpmyum

RPM 是RedHat PackManager的缩写 rpm是用于互联网下载包的打包及安装工具 rpm查询 查询已安装的rpm列表 rpm -qa查看系统是否安装了psmisc rpm -qa | grep psmisc rpm -q psmisc查询软件包信息 rpm -qi psmisc查询软件包中的文件 rpm -ql psmisc根据文件全路径 查询文件所…

[git]忽略.gitignore文件

git rm --cached .gitignore 是一个 Git 命令,主要用于 从版本控制中移除已追踪的 .gitignore 文件,但保留该文件在本地工作目录中。以下是详细解析: 一、命令拆解与核心作用 语法解析 git rm:Git 的删除命令,用于从版本库(Repository)中移除文件。--cached:关键参数…

Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法

一、排序与分发相关 BY 关键字 1. ORDER BY:全局统一排序 作用:对查询结果进行全局排序,确保最终结果集完全有序(仅允许单个 Reducer 处理数据)。 语法: SELECT * FROM table_name ORDER BY column1 [A…

网络爬虫 - App爬虫及代理的使用(十一)

App爬虫及代理的使用 一、App抓包1. App爬虫原理2. reqable的安装与配置1. reqable安装教程2. reqable的配置3. 模拟器的安装与配置1. 夜神模拟器的安装2. 夜神模拟器的配置4. 内联调试及注意事项1. 软件启动顺序2. 开启抓包功能3. reqable面板功能4. 夜神模拟器设置项5. 注意事…

【25.06】FISCOBCOS使用caliper自定义测试 通过webase 单机四节点 helloworld等进行测试

前置条件 安装一个Ubuntu20+的镜像 基础环境安装 Git cURL vim jq sudo apt install -y git curl vim jq Docker和Docker-compose 这个命令会自动安装docker sudo apt install docker-compose sudo chmod +x /usr/bin/docker-compose docker versiondocker-compose vers…

【基础】Unity中Camera组件知识点

一、投影模式 (Projection) 1. 透视模式 (Perspective) 原理:模拟人眼,近大远小(锥形体视锥) 核心参数: Field of View (FOV):垂直视场角 典型值:第一人称 60-90,驾驶舱 30-45 特…

PCA(K-L变换)人脸识别(python实现)

数据集分析 ORL数据集, 总共40个人,每个人拍摄10张人脸照片 照片格式为灰度图像,尺寸112 * 92 特点: 图像质量高,无需灰度运算、去噪等预处理 人脸已经位于图像正中央,但部分图像角度倾斜(可…