介紹
本篇Codelab是基于Flex容器組件,實現彈性布局效果。彈性布局的特點是頁面元素的寬度按照屏幕分辨率進行適配調整,但整體布局不變。
相關概念
- [Flex組件]:以彈性方式布局子組件的容器組件。
- [Search組件]:搜索框組件,適用于瀏覽器的搜索內容輸入框等應用場景。
- [Text組件]:顯示一段文本的組件。
- [Image組件]:圖片組件,支持本地圖片和網絡圖片的渲染展示。
- [Scroll組件]:可滑動的容器組件,當子組件的布局尺寸超過父組件的視口時,內容可以滑動。
- [條件渲染]:條件渲染可根據應用的不同狀態,使用if、else和else if渲染對應狀態下的UI內容。
- [循環渲染]:基于數組類型數據執行循環渲染。
環境搭建
軟件要求
- [DevEco Studio]版本:DevEco Studio 3.1 Release。
- OpenHarmony SDK版本:API version 9。
硬件要求
- 開發板類型:[潤和RK3568開發板]。
- OpenHarmony系統:3.2 Release。
環境搭建
完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:
- [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
- 搭建燒錄環境。
- [完成DevEco Device Tool的安裝]
- [完成RK3568開發板的燒錄]
- 搭建開發環境。
- 開始前請參考[工具準備],完成DevEco Studio的安裝和開發環境配置。
- 開發環境配置完成后,請參考[使用工程向導]創建工程(模板選擇“Empty Ability”)。
- 工程創建完成后,選擇使用[真機進行調測]。
- 鴻蒙開發指導文檔:[
qr23.cn/FBD4cY
]
代碼結構解讀
本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在gitee中提供。
├──entry/src/main/ets // 代碼區
│ ├──common
│ │ └──constants
│ │ └──StyleConstants.ets // 樣式常量類
│ ├──entryability
│ │ └──EntryAbility.ts // 程序入口類
│ ├──pages
│ │ └──HomePage.ets // 主界面
│ ├──view
│ │ ├──ClearSearch.ets // 清除歷史記錄自定義組件
│ │ ├──FlexLayout.ets // 彈性布局自定義組件
│ │ └──SearchInput.ets // 搜索輸入框自定義組件
│ └──viewmodel
│ └──SearchViewModel.ets // 歷史搜索數據類
└──entry/src/main/resources // 資源文件目錄
`HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`
編寫搜索框布局
在這個章節中,我們需要完成搜索框布局的編寫,并實現文本輸入和點擊事件。效果如圖所示:
在ets目錄下,點擊鼠標右鍵 > New > Directory,新建名為view的自定義子組件目錄。然后在view目錄下,點擊鼠標右鍵 > New > ArkTS File,新建名為SearchInput的ArkTS文件。最后在SearchInput.ets文件中,逐步完成如下操作:
- 使用@Component新增一個自定義組件,組件名為SearchInput。
- 在build()中使用Flex作為容器組件,實現子組件水平排列。
- 使用Search組件作為搜索框布局,Text組件作為搜索文本按鈕布局。
// SearchInput.ets
@Component
export default struct SearchInput {
build() {
Flex({ alignItems: ItemAlign.Center }) {
// 搜索框布局
Search()
...
// 搜索文本按鈕布局
Text($r('app.string.search'))
...
}
...
}
}
接下來我們實現Search組件的樣式及輸入功能,并將輸入的數據添加到數組searchArr中:
- 使用@State定義變量searchInput,存儲搜索框輸入的文本內容。
- 在Search組件參數中,將變量searchInput賦值給參數value,參數placeholder填寫提示內容,參數icon表示搜索圖標路徑。
- 設置高度height、寬度width、背景顏色backgroundColor、提示內容顏色placeholderColor等屬性。
- 設置onChange事件,將用戶輸入的內容綁定到變量searchInput中。
- 使用@Link定義一個數組變量searchArr,點擊搜索文本按鈕時,將用戶輸入的內容即searchInput的值,通過數組的unshift()方法,在數組searchArr的頭部添加數據。
// SearchInput.ets
@Component
export default struct SearchInput {
@State searchInput: string = '';
@Link searchArr: Array< string >;
build() {
Flex({ alignItems: ItemAlign.Center }) {
// 搜索框布局
Search({
value: this.searchInput,
placeholder: StyleConstants.SEARCH_PLACEHOLDER,
icon: StyleConstants.SEARCH_ICON
})
.placeholderColor($r('app.color.placeholder_color'))
.placeholderFont({ size: $r('app.float.font_size') })
.textFont({ size: $r('app.float.font_size') })
.height(StyleConstants.SEARCH_HEIGHT)
.width(StyleConstants.SEARCH_WIDTH)
.backgroundColor(Color.White)
...
.onChange((value: string) = > {
this.searchInput = value;
})
// 搜索文本按鈕布局
Text($r('app.string.search'))
...
.onClick(() = > {
if (this.searchInput !== '' && this.searchInput.trim().length > 0) {
// 使用unshift在數組頭部添加數據
this.searchArr.unshift(this.searchInput.trim());
}
this.searchInput = '';
})
}
...
}
}
然后我們在HomePage.ets首頁中,引入SearchInput搜索輸入框自定義組件。
- 使用@State定義數組變量searchArr,存放最近搜索文本內容。
- 在構造參數中,使用$符號引用@State修飾的變量searchArr,將父組件的變量searchArr與子組件searchArr變量關聯起來。
// HomePage.ets
import SearchInput from '../view/SearchInput';
@Entry
@Component
struct HomePage {
@State searchArr: Array< string > = SearchViewModel.getSearchArrData();
build() {
Column() {
// 搜索輸入框自定義組件
SearchInput({ searchArr: $searchArr })
}
...
}
}
編寫清除記錄布局
在這個章節中,我們需要完成清除記錄布局的編寫,并實現條件渲染。效果如圖所示:
在view目錄下,點擊鼠標右鍵 > New > ArkTS File,新建名為ClearSearch的ArkTS文件。然后在ClearSearch.ets文件中,逐步完成如下操作:
- 使用@Component新增一個自定義組件,組件名為ClearSearch。
- 在build()中使用Flex作為容器組件,實現子組件水平排列。
- 使用if/else實現條件渲染:當有搜索內容時,顯示最近搜索的文本和清除搜索內容圖標;否則就顯示沒有搜索內容和相關圖片。
- 使用@Link定義數組變量searchArr,當點擊清除搜索內容圖標時,所有最近搜索內容清空。
// ClearSearch.ets
@Component
export default struct ClearSearch {
// 搜索內容數組
@Link searchArr: Array< string >;
build() {
Flex({ alignItems: ItemAlign.Center }) {
if (this.searchArr.length > 0) {
Text($r('app.string.recent_searches'))
...
Image($r('app.media.ic_delete'))
...
.onClick(() = > {
this.searchArr.splice(0, this.searchArr.length);
this.searchArr.length = 0;
})
} else {
Column() {
Image($r('app.media.ic_no_search'))
...
Text($r('app.string.no_search_content'))
...
}
...
}
}
}
}
然后我們在HomePage.ets首頁中,引入ClearSearch搜索輸入框自定義組件。
// HomePage.ets
import SearchInput from '../view/SearchInput';
import ClearSearch from '../view/ClearSearch';
@Entry
@Component
struct HomePage {
@State searchArr: Array< string > = SearchViewModel.getSearchArrData();
build() {
Column() {
// 搜索輸入框自定義組件
SearchInput({ searchArr: $searchArr })
// 清除搜索記錄自定義組件
ClearSearch({ searchArr: $searchArr })
}
...
}
}
編寫彈性布局
在這個章節中,我們需要完成彈性布局的功能樣式,并實現循環渲染。效果如圖所示:
在view目錄下,點擊鼠標右鍵 > New > ArkTS File,新建名為FlexLayout的ArkTS文件。然后在FlexLayout.ets文件中,逐步完成如下操作:
- 使用@Component新增一個自定義組件,組件名為FlexLayout。
- 在build()中使用Flex作為容器,設置參數wrap為FlexWrap.Wrap時為彈性布局,實現自動換行。
- 使用if實現條件渲染,當有搜索內容時,顯示最近搜索的所有內容。
- 使用@Link定義數組變量searchArr,表示子組件要顯示的所有最近搜索文本內容。
- 使用ForEach遍歷變量searchArr,實現循環渲染。
// FlexLayout.ets
@Component
export default struct FlexLayout {
@Link searchArr: Array< string >;
build() {
Scroll() {
// Flex布局, wrap設置成FlexWrap.Wrap時為彈性布局
Flex({ justifyContent: FlexAlign.Start, wrap: FlexWrap.Wrap }) {
if (this.searchArr.length > 0) {
// 循環渲染
ForEach(this.searchArr, (item: string) = > {
Text(`${item}`)
...
}, (item: string) = > JSON.stringify(item))
}
}
...
}
}
}
然后我們在HomePage.ets首頁中,引入FlexLayout搜索輸入框自定義組件。
// HomePage.ets
import SearchInput from '../view/SearchInput';
import ClearSearch from '../view/ClearSearch';
import FlexLayout from '../view/FlexLayout';
@Entry
@Component
struct HomePage {
@State searchArr: Array< string > = SearchViewModel.getSearchArrData();
build() {
Column() {
// 搜索輸入框自定義組件
SearchInput({ searchArr: $searchArr })
// 清除搜索記錄自定義組件
ClearSearch({ searchArr: $searchArr })
// 彈性布局自定義組件
FlexLayout({ searchArr: $searchArr })
}
...
}
}
審核編輯 黃宇
-
開發板
+關注
關注
25文章
5050瀏覽量
97471 -
開發者
+關注
關注
1文章
575瀏覽量
17011 -
鴻蒙
+關注
關注
57文章
2352瀏覽量
42858 -
HarmonyOS
+關注
關注
79文章
1975瀏覽量
30194 -
OpenHarmony
+關注
關注
25文章
3722瀏覽量
16317
發布評論請先 登錄
相關推薦
評論