鴻蒙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
繁體地址,請注明出處:http://hk.pswp.cn/web/82441.shtml
英文地址,請注明出處:http://en.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 特點: 圖像質量高,無需灰度運算、去噪等預處理 人臉已經位于圖像正中央,但部分圖像角度傾斜(可…