ArkUI核心功能組件使用

1.Tabs(選項卡)

1.1 概述

Tabs組件的頁面組成包含兩個部分,分別是TabContent和TabBar。TabContent是內容頁,TabBar是導航頁簽欄。
TabBar是導航頁簽欄,頁面結構如下圖所示,根據不同的導航類型,布局會有區別,可以分為底部導航、頂部導航、側邊導航,其導航欄分別位于底部、頂部和側邊。
在這里插入圖片描述

1.2 基本使用

Tabs使用花括號包裹TabContent,每一個TabContent對應的內容需要有一個頁簽,可以通過TabContent的tabBar屬性進行配置。代碼如下

Tabs() {TabContent() {Text('首頁的內容').fontSize(30)}.tabBar('首頁')TabContent() {Text('推薦的內容').fontSize(30)}.tabBar('推薦')TabContent() {Text('發現的內容').fontSize(30)}.tabBar('發現')TabContent() {Text('我的內容').fontSize(30)}.tabBar("我的")
}

在這里插入圖片描述

1.3 導航位置

barPosition 屬性用來設置導航的位置,如下圖所示
在這里插入圖片描述

說明
● vertical為false時,tabbar的寬度默認為撐滿屏幕的寬度,需要設置barWidth為合適值。
● vertical為true時,tabbar的高度默認為實際內容的高度,需要設置barHeight為合適值。

1.4 禁止滑動切換

控制滑動切換的屬性為scrollable,默認值為true,表示可以滑動,若要限制滑動切換頁簽則需要設置為false。

Tabs({barPosition: BarPosition.Start}){...
}.scrollable(false)

1.5 滾動導航欄

當導航頁簽欄選項比較多時,可以讓導航頁簽滾動
在這里插入圖片描述

Tabs({ barPosition: BarPosition.Start }) {// TabContent的內容:關注、視頻、游戲、數碼、科技、體育、影視、人文、藝術、自然、軍事...
}
.barMode(BarMode.Scrollable)

1.6 自定義導航欄

對于底部導航欄,一般作為應用主頁面功能區分,為了更好的用戶體驗,會以“文字+圖標”表示頁簽內容,這種情況下,需要自定義導航頁簽的樣式。
在這里插入圖片描述

1.6.1自定義導航頁簽

自定義導航每一個頁簽包含四部分內容

  1. 頁簽文字
  2. 頁簽未選中圖片
  3. 頁簽選中時圖片
  4. 頁簽的索引
    創建一個@Builder tabBuilder(){…}函數,用于構建自定義導航頁簽內容。
/*
title: 頁簽標題
targetIndex: 頁簽的索引
selectedImg: 選中時圖標
normalImg: 未選中時
*/
//當前選中頁簽索引
@State currentIndex: number = 0
@Builder
tabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {Column() {Image(this.currentIndex == targetIndex ? selectedImg : normalImg).size({ width: 25, height: 25 })Text(title).fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')}.width('100%').height(50).justifyContent(FlexAlign.Center).onClick(() => {this.currentIndex = targetIndex})
}

在調用TabContent對應.tabBar(this.tabBuilder(…)),傳入相對應的參數。代碼如下

@Entry
@Component
struct TabsDemo {build() {Tabs({barPosition: BarPosition.End}){TabContent(){Text('首頁')}.tabBar(this.tabBuilder('首頁',0,$r('app.media.home_selected'),$r('app.media.home_normal')))TabContent(){Text('推薦')}.tabBar(this.tabBuilder('推薦',1,$r('app.media.home_selected'),$r('app.media.home_normal')))TabContent(){Text('熱門')}.tabBar(this.tabBuilder('熱門',2,$r('app.media.home_selected'),$r('app.media.home_normal')))TabContent(){Text('文化')}.tabBar(this.tabBuilder('文化',3,$r('app.media.home_selected'),$r('app.media.home_normal')))}})
}

如下圖所示,此時點擊頁簽,能夠實現選中與未選中的變色效果。
在這里插入圖片描述
但是此時還有一個問題,點擊頁簽時并不能同步切換內容頁。

1.6.2 點擊頁簽同步切換內容頁

想要實現點擊頁簽同步切換頁面,需要讓Tabs與TabsController相關聯,TabsController是用來控制頁面切換的控制器,并調用TabsController的changeIndex(索引)切換內容頁。

  1. 創建TabController與Tabs關聯
tabsController: TabsController = new TabsController()build() {Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {... }
}
  1. 給自定義頁簽設置點擊事件,調用TabController的changeIndex(索引)切換頁簽。
    在這里插入圖片描述
1.6.3滑動內容頁同步切換頁簽

在自定義導航欄的情況下,滑動內容頁時,頁簽是不會同步切換的;此時需要監聽內容頁的改變,手動進行切換;

Tabs({ barPosition: BarPosition.End, controller: this.tabController }) {TabContent() {Text('首頁內容')}.tabBar(this.tabBuilder('首頁', 0, $r('app.media.home_selected'), $r('app.media.home_normal')))...
}.onChange((index) => {this.currentIndex = index
})

效果如下
在這里插入圖片描述

2.List(列表)

2.1 基本概念

List列表是一種復雜容器,當列表項達到一定數量,內容超過屏幕大小時,可以自動提供滾動功能。使用列表可以輕松高效地顯示結構化、可滾動的信息。

在這里插入圖片描述

2.2 基本使用

List和ListItem是結合起來使用的,List表示列表容器,而ListItem表示列表中的列表項。
如下圖所示,這是一個最簡單的列表,每一個列表項顯示一個文本

在這里插入圖片描述

@Entry
@Component
struct CityList {build() {List() {ListItem() {Text('北京').fontSize(24)}ListItem() {Text('杭州').fontSize(24)}ListItem() {Text('上海').fontSize(24)}}.backgroundColor('#FFF1F3F5').alignListItem(ListItemAlign.Center)}
}

2.3 循環渲染

如果List種ListItem列表項非常多,肯定不能一個一個列舉,這個時候需要用到ForEach循環渲染。ForEach循環渲染的格式如下

ForEach(數據集;(元素)=>{//需要虛幻渲染的內容
})

比如我現在想要使用List列表顯示中國的所有省會城市。

@Entry
@Component
struct CityList {// 定義一個字符串數組,包含中國所有的省會城市citys: string[] = ["北京","上海","天津","重慶","哈爾濱", // 黑龍江省"長春", // 吉林省"沈陽", // 遼寧省"呼和浩特", // 內蒙古自治區"石家莊", // 河北省"太原", // 山西省"西安", // 陜西省"蘭州", // 甘肅省"西寧", // 青海省"銀川", // 寧夏回族自治區"烏魯木齊", // 新疆維吾爾自治區"南寧", // 廣西壯族自治區"廣州", // 廣東省"海口", // 海南省"成都", // 四川省"貴陽", // 貴州省"昆明", // 云南省"拉薩", // 西藏自治區"鄭州", // 河南省"濟南", // 山東省"南京", // 江蘇省"杭州", // 浙江省"合肥", // 安徽省"福州", // 福建省"臺北", // 臺灣省(注意:政治和實際情況可能有所不同)"南昌", // 江西省"長沙", // 湖南省"武漢",// 湖北省];build() {List() {ForEach(this.citys, (item: string) => {ListItem() {Text(item).fontSize(24)}})}.backgroundColor('#FFF1F3F5').alignListItem(ListItemAlign.Center)}
}

2.4 列表樣式

  1. 設置列表項間距
List({ space: 10 }) {// ...
}
  1. 設置列表項分割線
List() {// ...
}
.divider({strokeWidth: 0.5,	//分割線的粗細color:Color.Black	//分割線的顏色
})
  1. 設置滾動條
List() {// ...
}
.scrollBar(BarState.Auto) //默認不顯示,滾動時顯示,2秒后消失

修改上面的案例,給列表加入自定義樣式,代碼如下

List({ space: 20 }) {ForEach(this.citys, (item: string) => {ListItem() {Text(item).fontSize(24)}})}.backgroundColor('#FFF1F3F5').alignListItem(ListItemAlign.Center)	//交叉軸居中顯示.divider({														//加入分割線strokeWidth:1,  //線條粗細startMargin:20, //線條開始外邊距endMargin:20,   //線條結尾外邊距color:'#dedede'}).scrollBar(BarState.Auto) //默認不顯示,滾動時顯示,2秒后消失

在這里插入圖片描述

2.5 復雜列表

案例需求:如下圖所示是一個任務列表

  1. 每一個列表項包含:任務標題、任務創建時間、任務選中狀態
  2. 點擊添加時,添加列項到任務列表
  3. 點擊刪除時,將處于選中狀態的列表項從列表中刪除
  4. 點擊取消時,列表項處于不可編輯狀態(不顯示復選框);長按列表項時,列表項處于可編輯狀態(顯示復選框)

在這里插入圖片描述

2.5.1復雜列表的設計思路

當一個列表項顯示的內容比較多時,一般會將列表項的UI和列表項的數據分離開來。如下圖所示,是一個任務列表的列表項;

在這里插入圖片描述

左圖:用一個類來封裝列表項的數據;
右圖:將列表項的UI用自定義組件來表示;
合并:最后列表項的UI和數據綁定即可
多個列表項:采用ForEach循環渲染列表項就可以了

在這里插入圖片描述

2.5.2 創建列表項數據模型

分析頁面發現,每一個ListItem擁有三個數據,分別是:標題、創建時間、選中狀態,根據編輯狀態決定是否顯示復選框。

class TargetItemData {title: string //目標標題createTime: string //創建時間checkStatus: boolean //選中狀態  //1未選中,2選中constructor(title: string //目標標題, checkStatus: boolean //選中狀態) {this.title = title;this.createTime = this.getCurrentTime();this.checkStatus = checkStatus;}//獲取當前系統時間getCurrentTime(): string {let date = new Date();let year = date.getFullYear();let month = date.getMonth() + 1;let day = date.getDate();let hours = date.getHours();let minutes = date.getMinutes().toString();if (Number.parseInt(minutes) < 10) {minutes = `0${minutes}`;}let second = date.getSeconds().toString();if (Number.parseInt(second) < 10) {second = `0${second}`;}return `${year}/${month}/${day} ${hours}:${minutes}:${second}`;}
}
2.5.3 創建列表項組件

分析頁面,每一個Item組件包括:一個標題Text、一個時間Text、一個復選框CheckBox;其中CheckBox根據狀態決定顯示或者不顯示。
在這里插入圖片描述

@Entry
@Component
struct Index {//2.創建Item組件,并與Item數據模型綁定@State isEditModel: number = 1 //是否編輯(1未編輯、2編輯)@BuildertargetItem(data: TargetItemData) {Row() {Column() {Text(data.title).width('100%').fontSize(18)Text(`創建時間:${data.createTime}`).fontSize(12).fontColor('#A5A6AA').margin({ top: 8 })}.alignItems(HorizontalAlign.Start).layoutWeight(9)if (this.isEditModel == 2) {Checkbox().select(data.checkStatus).layoutWeight(1).onChange((status) => {data.checkStatus = status})}}.padding({left: 12, right: 12}).backgroundColor(Color.White).height(68).border({ radius: 15 }).margin({ left: 12, right: 12 })}build() {//...}
}
2.5.4 循環渲染列表項

分析主頁面的布局結構,如下圖所示,我們先把中間列表這部分寫出來,其他的先放一下后面再完成
在這里插入圖片描述

//1.定義Item數據模型
//...@Entry
@Component
struct Index {//2.創建Item組件與Item數據模型綁定//...//3.創建Item數據集,并循環渲染到List容器中@State targets: Array<TargetItemData> = [new TargetItemData('運動', false),new TargetItemData('讀書', false),new TargetItemData('聽音樂', false),new TargetItemData('看電影', false),new TargetItemData('旅游', false)]build() {Column() {List({ space: 20 }) {ForEach(this.targets, (item: TargetItemData) => {ListItem() {this.targetItem(item)}})}.margin({ top: 20 })}.width('100%').height('100%').backgroundColor('#E9E9EB')}
}
2.5.5 給列表項添加長按事件

給ListItem添加長按事件,檢測到手指長按時改變Item狀態。

ListItem() {this.targetItem(item)
}.gesture(LongPressGesture({ duration: 500 }).onAction((event) => {this.isEditModel = 2 //編輯模式
}))
2.5.6 新增/刪除列表項

當點擊新增按鈕時,新增一個列表項;點擊刪除按鈕時,刪除選中的列表項。
在這里插入圖片描述

@Entry
@Component
struct Index {//...@State isEditModel: number = 1 //是否編輯(1未編輯、2編輯)build() {Column() {List({ space: 20 }) {//...}.margin({ top: 20 }).layoutWeight(9)		//權重9//操作按鈕Column() {if (this.isEditModel == 1) {Button('新增').width('80%').onClick(() => {this.targets.push(new TargetItemData('釣魚',false))})} else {Button('刪除').width('80%').onClick(() => {let leftData = this.targets.filter((item) => item.checkStatus == false)              this.targets = leftData;this.isEditModel = 1	//設置為未編輯狀態})}}.width('100%').layoutWeight(1)	//權重1.justifyContent(FlexAlign.Center)}.width('100%').height('100%').backgroundColor('#E9E9EB')}
}

3. Swiper(輪播)

3.1 基本概念

Swiper一般用來顯示輪播圖,在很多應用的首頁都會有輪播圖展示廣告或者一些重要的信息。如下圖所示,輪播展示幾張圖片。
在這里插入圖片描述

3.2 基本使用

Swiper的基本使用也非常簡單,只需要以下兩個步驟即可
● 準備輪播數據(我這里就是4張圖片,如果每一個輪播數據比較多也可以封裝成對象)
● 循環渲染輪播數據
代碼如下

@Entry
@Component
struct Index {//1. 準備輪播數據swiperImages: Resource[] = [$r('app.media.fig1'),$r('app.media.fig2'),$r('app.media.fig3'),$r('app.media.fig4'),]build() {Column() {Swiper() {//2.循環輪播數據ForEach(this.swiperImages, (img: Resource) => {Image(img).borderRadius(16).width('100%')})}.margin({ top: 12 }).autoPlay(true) //自動播放}.margin({left: 12, right: 12})}
}

3.3 導航點指示器

Swiper(){ForEach(this.imageArray,(item:Resource)=>{Image(item).width('100%').height(200).borderRadius(10)})
}
//.indicator(false)  true表示有導航點、false表示沒有導航點
.indicator(//Indicator.digit() //數字導航指示效果Indicator.dot() //原點導航點.itemWidth(20)  //未選中的寬度.selectedItemWidth(20)  //選中的寬度.color(Color.Red) //未選中的顏色.selectedColor(Color.Yellow)  //選中的顏色
)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95237.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt5 多媒體大綱

一、入門準備 基礎知識 熟悉 Qt 的信號槽機制、事件循環 掌握 .pro 工程文件配置&#xff08;QT multimedia multimediawidgets&#xff09; 熟悉常見的音視頻格式與編解碼器基礎 環境配置 Qt Creator Qt 5.x 確認安裝了 multimedia 模塊與 mediaservice 插件 熟悉調試…

音頻數據集采樣率選擇建議

你好&#xff01;這是一個非常棒且非常重要的問題&#xff0c;在音頻機器學習項目中&#xff0c;選擇合適的采樣率是平衡計算效率和模型性能的關鍵。 直接回答你的問題&#xff1a;將音頻下采樣到 800 Hz 對于絕大多數音頻分類任務來說都太低了&#xff0c;幾乎肯定會丟失大量關…

深度學習系列 | Seq2Seq端到端翻譯模型

一、通俗總結Seq2Seq 就像一個 “序列轉換器”&#xff1a;先把輸入的一段話 “壓縮成一個核心意思”&#xff0c;再根據這個意思 “一句句生成另一段話”&#xff0c;能搞定翻譯、聽寫這類 “輸入輸出不一樣長” 的任務&#xff0c;但太長的內容可能記不全&#xff0c;還容易越…

Spring MVC BOOT 中體現的設計模式

Spring:創建型:單例模式:Bean默認就是單例的&#xff0c;是餓漢模式的&#xff0c;但是可以通過Lazy設置為懶漢工廠模式&#xff1a;可自定義FactroyBean&#xff0c;實現Bean自己的生產工廠結構型:代理模式&#xff1a;AOP就是典型的動態代理&#xff0c;有jdk和cglib兩種實現…

Chrome瀏覽器調用ActiveX控件之allWebOffice在線編輯控件

背景 allWebOffice控件能夠實現在瀏覽器窗口中在線操作文檔的應用&#xff08;閱讀、編輯、保存等&#xff09;&#xff0c;支持編輯文檔時保留修改痕跡&#xff0c;支持書簽位置內容動態填充&#xff0c;支持公文套紅&#xff0c;支持文檔保護控制等諸多辦公功能&#xff0c;本…

嵌入式 - 硬件:51單片機

本節重點1. MCU、CPU、GPU、NPU、SOC、MPU、FPU2. 內存、外存的區別3. RAM和ROM的區別&#xff0c;單片機RAM大小4. 三大總線及其特點5. 發光二極管分類及其特點6. 數碼管顯示原理一、嵌入式以應用為中心&#xff0c;以計算機技術為基礎&#xff0c;軟硬件可裁剪的專用計算機系…

Java Spring Boot 中 Redis 緩存穿透問題排查與解決方案

前言 作為一名普通的 Java 程序開發者&#xff0c;日常開發中難免會遇到一些看似簡單但實際排查起來非常棘手的問題。在最近的一個項目中&#xff0c;我遇到了一個 Redis 緩存穿透的問題&#xff0c;導致系統在高并發下性能急劇下降&#xff0c;甚至出現服務響應超時的情況。這…

Ubuntu下配置并遠程連接MySQL

1、安裝mysql-serverapt update apt install mysql-server2、修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0 mysqlx-bind-address 0.0.0.03、啟動并設置服務為開機自啟動systemctl enable mysql.service --now4、查看服務狀態systemct…

開源 C++ QT Widget 開發(九)圖表--儀表盤

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 C QT Widget 開發&#xff08;一&#xff09;工程文件結構-CSDN博客 開源…

怎么為服務器設置或重置服務器密碼?

創建服務器后&#xff0c;您可以設置服務器的登錄密碼&#xff0c;如果你忘記了密碼&#xff0c;可以重新設置實例的密碼。本文講一下如何重置阿里云服務器密碼。使用限制&#xff1a;離線重置密碼僅支持在控制臺設置或重置服務器管理員賬號的密碼。?Windows 實例的默認用戶名…

【線性代數入門 | 那忘算8】洛谷P3389 高斯消元(內附行列式教學)

想了想還是單開了一篇&#xff0c;數學王子值得&#xff01; 專欄指路&#xff1a;《再來一遍一定記住的算法&#xff08;那些你可能忘記了的算法&#xff09;》 前置知識&#xff1a; 矩陣&#xff1a;數的集合&#xff0c;一般是方程的系數。 題面&#xff1a; 洛谷P3389 …

GEM5學習(3):如何快速創建一個組件

通過一個圖并行計算的測試用例&#xff0c;來學習如何快速構建一個目標組件 其核心思想是通過繼承現有組件再拓展自定義參數 創建腳本 如何創建腳本&#xff0c;具體還可以看官方說明&#xff1a;gem5: Adding cache to configuration script mkdir configs/tutorial/part1/…

數據血緣中的圖數據庫如何選擇

Neo4j 和 ArangoDB 都是非常優秀的圖數據庫&#xff0c;但它們的設計哲學、核心架構和適用場景有顯著的區別。 簡單來說&#xff0c;核心區別在于&#xff1a; Neo4j 是原生圖數據庫&#xff0c;專為處理圖數據和圖查詢而設計和優化。ArangoDB 是多模型數據庫&#xff0c;同時支…

第27章學習筆記|學無止境:從“會用命令”到“會做工具”的進階路線

第27章學習筆記|學無止境:從“會用命令”到“會做工具”的進階路線 你已經能用 PowerShell 解決很多日常問題了。接下來最重要的,就是把零散命令升級為可復用的工具,并在真實場景中不斷打磨。 一、為什么下一步是“工具化(Toolmaking)” 當任務開始“重復、多人用、可移…

C++編程語言:標準庫:第37章——正則表達式(Bjarne Stroustrup)

第 37章 正則表達式(Regular Expressions) 目錄 37.1 正則表達式(規范表達式)(Regular Expressions) 37.1.1 正則表達式相關符號(Regular Express Notation) 37.2 regex 37.2.1 匹配結果(Match Results) 37.2.2 格式化(Formatting) 37.3 正則表達式函數 37.3.1 …

sciml包scixgboost函數發布,輕松完成機器學習xgboost分析

Xgboost是Boosting算法的其中一種&#xff0c;Boosting算法的思想是將許多弱分類器集成在一起&#xff0c;形成一個強分類器。因為Xgboost是一種提升樹模型&#xff0c;所以它是將許多樹模型集成在一起&#xff0c;形成一個很強的分類器。 我目前整合了多個R包&#xff0c;編寫…

Ubuntu中配置JMmeter工具

1、檢查是否已安裝Java 環境java -version若未安裝&#xff0c;執行以下命令安裝 OpenJDKsudo apt update sudo apt install openjdk-11-jdk # 或 openjdk-17-jdk2、用wget直接下載JMeter壓縮包wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz將下載的…

LeetCode 925.長按鍵入

你的朋友正在使用鍵盤輸入他的名字 name。偶爾&#xff0c;在鍵入字符 c 時&#xff0c;按鍵可能會被長按&#xff0c;而字符可能被輸入 1 次或多次。 你將會檢查鍵盤輸入的字符 typed。如果它對應的可能是你的朋友的名字&#xff08;其中一些字符可能被長按&#xff09;&#…

9.3 模擬

lc190 顛倒二進制ret (ret << 1) (n >> i & 1);class Solution { public:uint32_t reverseBits(uint32_t n) {uint32_t ret 0;for (int i 0; i < 32; i)ret (ret << 1) (n >> i & 1);return ret;} };lc14 flag checkclass Solution {…

esp32小智ai對話機器人

ESP-IDF 環境搭建與問題解決 下載與安裝 ESP-IDF 官方下載地址&#xff1a;https://dl.espressif.com/dl/esp-idf建議使用穩定版本&#xff0c;避免開發版可能存在的兼容性問題 中文編碼問題解決方案 $env:PYTHONIOENCODING "utf-8" $env:PYTHONUTF8 "1&q…