ToB企服应用市场:ToB评测及商务社交产业平台
标题:
鸿蒙实战开发-使用常用组件与结构实现登录、首页、我的三个页面
[打印本页]
作者:
王海鱼
时间:
2024-6-21 19:21
标题:
鸿蒙实战开发-使用常用组件与结构实现登录、首页、我的三个页面
先容
HarmonyOS ArkUI提供了丰富多样的UI组件,您可以使用这些组件轻松地编写出更加丰富、漂亮的界面。在本篇Codelab中,您将通过一个简朴的购物交际应用示例,学习如何使用常用的底子组件和容器组件。
本示例重要包罗:“登录”、“首页”、“我的”三个页面,结果图如下:
相关概念
Text:表现一段文本的组件。
Image:图片组件,支持本舆图片和网络图片的渲染展示。
TextInput:可以输入单行文本并支持响应输入事故的组件。
Button:按钮组件,可快速创建差别样式的按钮。
LoadingProgress:用于表现加载动效的组件。
Flex:应用弹性方式结构子组件的容器组件。
Column:沿垂直方向结构的容器。
Row:沿水平方向结构容器。
List:列表包罗一系列相同宽度的列表项。得当连续、多行出现同类数据,例如图片和文本。
Swiper:滑动容器,提供切换子组件表现的本领。
Grid:网格容器,由“行”和“列”分割的单位格所组成,通过指定“项目”地点的单位格做出各种各样的结构。
环境搭建
软件要求
DevEco Studio版本:DevEco Studio 3.1 Release。
OpenHarmony SDK版本:API version 9。
硬件要求
开发板范例:润和RK3568开发板。
OpenHarmony系统:3.2 Release。
环境搭建
完本钱篇Codelab我们首先要完成开发环境的搭建,本示例以
RK3568
开发板为例,参照以下步骤举行:
获取OpenHarmony系统版本:标准系统解决方案(二进制)。以3.2 Release版本为例:
2.搭建烧录环境。
完成DevEco Device Tool的安装
完成RK3568开发板的烧录
3.搭建开发环境。
开始前请参考工具准备,完成DevEco Studio的安装和开发环境配置。
开发环境配置完成后,请参考使用工程向导创建工程(模板选择“Empty Ability”)。
工程创建完成后,选择使用真机举行调测。
代码结构解读
本篇Codelab只对核心代码举行讲解。
├──entry/src/main/ets // 代码区
│ ├──common
│ │ └──constants
│ │ └──CommonConstants.ets // 公共常量类
│ ├──entryability
│ │ └──EntryAbility.ts // 程序入口类
│ ├──pages
│ │ ├──LoginPage.ets // 登录界面
│ │ └──MainPage.ets // 主界面
│ ├──view
│ │ ├──Home.ets // 首页
│ │ └──Setting.ets // 设置页
│ └──viewmodel
│ ├──ItemData.ets // 列表数据实体类
│ └──MainViewModel.ets // 主界面视图Model
└──entry/src/main/resources // 应用资源目录
复制代码
实现“登录”页面
本节重要先容“登录”页面的实现,结果图如下:
界面使用Column容器组件结构,由Image、Text、TextInput、Button、LoadingProgress等底子组件构成,重要代码如下:
// LoginPage.ets
@Entry
@Component
struct LoginPage {
...
build() {
Column() {
Image($r('app.media.logo'))
...
Text($r('app.string.login_page'))
...
Text($r('app.string.login_more'))
...
TextInput({ placeholder: $r('app.string.account') })
...
TextInput({ placeholder: $r('app.string.password') })
...
Row() {
Text($r('app.string.message_login')).blueTextStyle()
Text($r('app.string.forgot_password')).blueTextStyle()
}
....
Button($r('app.string.login'), { type: ButtonType.Capsule })
....
Text($r('app.string.register_account'))
....
if (this.isShowProgress) {
LoadingProgress()
....
}
Blank()
Text($r('app.string.other_login_method'))
....
Row({ space: CommonConstants.LOGIN_METHODS_SPACE }) {
this.imageButton($r('app.media.login_method1'))
this.imageButton($r('app.media.login_method2'))
this.imageButton($r('app.media.login_method3'))
}
}
....
}
}
复制代码
获取用户输入
当用户登录前,需要获取用户输入的帐号和暗码才气执行登录逻辑。给TextInput设置onChange事故,在onChange事故里面及时获取用户输入的文本信息。
// LoginPage.ets
TextInput({ placeholder: $r('app.string.account') })
.maxLength(CommonConstants.INPUT_ACCOUNT_LENGTH)
.type(InputType.Number)
.inputStyle()
.onChange((value: string) => {
this.account = value;
})
复制代码
控制LoadingProgress表现和隐藏
给登录按钮绑定onClick事故,调用login方法模拟登录。界说变量isShowProgress联合条件渲染if用来控制LoadingProgress的表现和隐藏。当用户点击按钮时设置isShowProgress为true,即表现LoadingProgress;使用定时器setTimeout设置isShowProgress 2秒后为false,即隐藏LoadingProgress,然后执行跳转到首页的逻辑。
// LoginPage.ets
@Entry
@Component
struct LoginPage {
@State account: string = '';
@State password: string = '';
@State isShowProgress: boolean = false;
private timeOutId = null;
...
login() {
if (this.account === '' || this.password === '') {
prompt.showToast({
message: $r('app.string.input_empty_tips')
})
} else {
this.isShowProgress = true;
if (this.timeOutId === null) {
this.timeOutId = setTimeout(() => {
this.isShowProgress = false;
this.timeOutId = null;
router.replaceUrl({ url: 'pages/MainPage' });
}, CommonConstants.LOGIN_DELAY_TIME);
}
}
}
...
build() {
Column() {
...
Button($r('app.string.login'), { type: ButtonType.Capsule })
....
.onClick(() => {
this.login();
})
...
if (this.isShowProgress) {
LoadingProgress()
.color($r('app.color.loading_color'))
.width($r('app.float.login_progress_size'))
.height($r('app.float.login_progress_size'))
.margin({ top: $r('app.float.login_progress_margin_top') })
}
...
}
...
}
}
复制代码
实现页面跳转
页面间的跳转可以使用router模块相关API来实现,使用前需要先导入该模块,然后使用router.replace()方法实现页面跳转。
// LoginPage.ets
import router from '@ohos.router';
login() {
if (this.account === '' || this.password === '') {
...
} else {
this.isShowProgress = true;
if (this.timeOutId === -1) {
this.timeOutId = setTimeout(() => {
this.isShowProgress = false;
this.timeOutId = -1;
router.replaceUrl({ url: 'pages/MainPage' });
}, CommonConstants.LOGIN_DELAY_TIME);
}
}
}
复制代码
实现“首页”和“我的”页面
界说资源数据
由于“首页”和“我的”页面中有多处图片和笔墨的组合,因此提取出ItemData类。在MainViewModel.ets文件中对页面使用的资源举行界说,在MainViewModel.ets文件中界说数据。
// ItemData.ets
export default class PageResource {
title: Resource;
img?: Resource;
others?: Resource;
constructor(title: Resource, img?: Resource, others?: Resource) {
this.title = title;
this.img = img;
this.others = others;
}
}
// MainViewModel.ets
import ItemData from './temData';
export class MainViewModel {
...
getFirstGridData(): Array<ItemData> {
let firstGridData: ItemData[] = [
new ItemData($r('app.string.my_love'), $r('app.media.love')),
new ItemData($r('app.string.history_record'), $r('app.media.record')),
...
];
return firstGridData;
}
...
}
export default new MainViewModel();
复制代码
实现页面框架
从前面先容章节的示意图可以看出,本示例由两个tab页组成,使用Tabs组件来实现,提取tabBar的公共样式,同时设置TabContent和Tabs的backgroundColor来实现底部tabBar栏背景致突出的结果。
// MainPage.ets
Tabs({
barPosition: BarPosition.End,
controller: this.tabsController
}) {
TabContent() {
...
}
...
.backgroundColor($r('app.color.mainPage_backgroundColor')) // “首页”的页面背景色
.tabBar(this.TabBuilder(CommonConstants.HOME_TITLE, CommonConstants.HOME_TAB_INDEX,
$r('app.media.home_selected'), $r('app.media.home_normal')))
...
}
...
.backgroundColor(Color.White) // 底部tabBar栏背景色
...
.onChange((index: number) => {
this.currentIndex = index;
})
...
复制代码
实现“首页”内容
“首页”结果如下所示:
从上面结果如可以看出“首页”由三部分内容组成分别是轮播图、2*4栅格图、4*4栅格图。首先使用Swiper组件实现轮播图,无需设置图片大小。
// Home.ets
Swiper(this.swiperController) {
ForEach(mainViewModel.getSwiperImages(), (img: Resource) => {
Image(img).borderRadius($r('app.float.home_swiper_borderRadius'))
}, (img: Resource) => JSON.stringify(img.id))
}
...
.autoPlay(true)
...
复制代码
然后使用Grid组件实现2*4栅格图,代码如下
// Home.ets
Grid() {
ForEach(mainViewModel.getFirstGridData(), (item: ItemData) => {
GridItem() {
Column() {
Image(item.img)
.width($r('app.float.home_homeCell_size'))
.height($r('app.float.home_homeCell_size'))
Text(item.title)
.fontSize($r('app.float.little_text_size'))
.margin({ top: $r('app.float.home_homeCell_margin') })
}
}
}, (item: ItemData) => JSON.stringify(item))
}
.columnsTemplate('1fr 1fr 1fr 1fr')
.rowsTemplate('1fr 1fr')
...
复制代码
使用Grid组件实现4*4栅格列表栏,其中单个栅格中有一张背景图片和两行字体差别的文本,因此在Column组件中放置两个Text组件,并设置背景图,留意Grid组件必须设置高度,否则大概出现页面空白。
// Home.ets
Grid() {
ForEach(mainViewModel.getSecondGridData(), (secondItem: ItemData) => {
GridItem() {
Column() {
Text(secondItem.title)
...
Text(secondItem.others)
...
}
.alignItems(HorizontalAlign.Start)
}
...
.backgroundImage(secondItem.img)
.backgroundImageSize(ImageSize.Cover)
...
}, (secondItem: ItemData) => JSON.stringify(secondItem))
}
...
.height($r('app.float.home_secondGrid_height'))
.columnsTemplate('1fr 1fr')
.rowsTemplate('1fr 1fr')
...
复制代码
实现“我的”页内容
“我的”页面结果图如下:
使用List组件联合ForEach语句来实现页面列表内容,其中引用了settingCell子组件,列表间的灰色分割线可以使用Divider属性实现,代码实现如下:
// Setting.ets
List() {
ForEach(mainViewModel.getSettingListData(), (item: ItemData) => {
ListItem() {
this.settingCell(item)
}
.height($r('app.float.setting_list_height'))
}, (item: ItemData) => JSON.stringify(item))
}
...
.divider({ // 设置分隔线
...
})
...
@Builder settingCell(item: ItemData) {
Row() {
Row({ space: CommonConstants.COMMON_SPACE }) {
Image(item.img)
...
Text(item.title)
...
}
if (item.others === null) {
Image($r("app.media.right_grey"))
...
} else {
Toggle({ type: ToggleType.Switch, isOn: false })
}
}
.justifyContent(FlexAlign.SpaceBetween) // 相邻元素之间距离相同
...
}
复制代码
总结
目前你已经乐成完成了Codelab而且学到了:
Button、Image、TextInput、Text等底子组件的使用。
Column、Row、List、Tabs等容器组件的使用。
为了资助各人更深入有效的学习到鸿蒙开发知识点,小编特意给各人准备了一份全套最新版的HarmonyOS NEXT学习资源,
获取完备版方式请点击→《
HarmonyOS讲授视频
》
HarmonyOS讲授视频:语法ArkTS、TypeScript、ArkUI等…视频教程
鸿蒙生态应用开发白皮书V2.0PDF:
获取完备版白皮书方式请点击→《
鸿蒙生态应用开发白皮书V2.0PDF
》
鸿蒙 (Harmony OS)开发学习手册
一、入门必看
应用开发导读(ArkTS)
.……
二、HarmonyOS 概念
系统界说
技能架构
技能特性
系统安全
…
三、如何快速入门?《鸿蒙底子入门学习指南》
根本概念
构建第一个ArkTS应用
.……
四、开发底子知识
应用底子知识
配置文件
应用数据管理
应用安全管理
应用隐私保护
三方应用调用管控机制
资源分类与访问
学习ArkTS语言
.……
五、基于ArkTS 开发
Ability开发
UI开发
公共事故与关照
窗口管理
媒体
安全
7.网络与链接
电话服务
数据管理
后台任务(Background Task)管理
设备管理
设备使用信息统计
DFX
国际化开发
折叠屏系列
.……
更多相识更多鸿蒙开发的相关知识可以参考:《
鸿蒙 (Harmony OS)开发学习手册
》
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4