命令式
简单讲就是需要开发用代码一步一步进行布局,这个过程需要开发全程参与。
开发前请熟悉鸿蒙开发指导文档:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]
- Objective-C
ObjectiveC
复制代码
UIView *cardView = [[UIView alloc] init];
cardView.backgroundColor = [UIColor whiteColor];
cardView.layer.cornerRadius = 16;
cardView.clipsToBounds = YES;
[self.view addSubview:cardView];
[cardView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_offset(-16);
make.height.mas_equalTo(116);
make.top.mas_equalTo(100);
}];
NSString *imgUrl = @"https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg";
UIImageView *imgView = [[UIImageView alloc] init];
imgView.backgroundColor = [UIColor lightGrayColor];
[imgView sd_setImageWithURL:[NSURL URLWithString:imgUrl]];
[cardView addSubview:imgView];
[imgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.mas_offset(0);
make.left.mas_equalTo(0);
make.width.mas_equalTo(107);
}];
UILabel *titleLbl = [[UILabel alloc] init];
titleLbl.font = [UIFont systemFontOfSize:14 weight:UIFontWeightBold];
titleLbl.textColor = [UIColor blackColor];
titleLbl.text = @"万柳书院新一区 南北向满五唯一";
[cardView addSubview:titleLbl];
[titleLbl mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(imgView.mas_right).mas_offset(12);
make.right.mas_offset(-12);
make.top.mas_equalTo(16);
}];
UILabel *subTitleLbl = [[UILabel alloc] init];
subTitleLbl.textColor = [UIColor blackColor];
subTitleLbl.font = [UIFont systemFontOfSize:12 weight:UIFontWeightRegular];
subTitleLbl.text = @"4室2厅/278.35㎡/南 北/万柳书院";
[cardView addSubview:subTitleLbl];
[subTitleLbl mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.mas_equalTo(titleLbl);
make.top.mas_equalTo(titleLbl.mas_bottom).mas_offset(8);
}];
UILabel *priceLbl = [[UILabel alloc] init];
priceLbl.font = [UIFont systemFontOfSize:14 weight:UIFontWeightBold];
priceLbl.textColor = [UIColor redColor];
priceLbl.text = @"4238万";
[cardView addSubview:priceLbl];
[priceLbl mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(titleLbl);
make.bottom.mas_offset(-16);
}];
UILabel *avgPriceLbl = [[UILabel alloc] init];
avgPriceLbl.textColor = [UIColor lightGrayColor];
avgPriceLbl.font = [UIFont systemFontOfSize:12 weight:UIFontWeightRegular];
avgPriceLbl.text = @"155,445元/平";
[cardView addSubview:avgPriceLbl];
[avgPriceLbl mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(priceLbl.mas_right).mas_offset(2);
make.right.mas_lessThanOrEqualTo(titleLbl.mas_right);
make.bottom.mas_equalTo(priceLbl);
}];
声明式
声明式则是由开发使用语言描述UI页面长什么样子,之后全权交给引擎去做
- 对页面结构进行大的拆解。比如上面卡片分左右两大部分
- 选用合适的容器组件进行页面描述
- 针对拆解出来的每个部分重复上面的两步,直到无法拆解只能使用基本组件描述为止
比如上面的卡片可以进行如下的拆分
- 整体是一个Row容器,分为左右两大部分,左边是图片,右边是一个Column容器
- 右边Column容器又拆分为两大部分,上面是标题和描述,下面是价格。两部分按照space-between布局
- 上面的标题和描述作为一个整体,里面拆分成Column的两个组件
- 下面价格可以直接使用系统组件Text
ReactNative
TypeScript
复制代码
< View
style={{
borderRadius: 8,
marginHorizontal: 16,
flexDirection: 'row',
backgroundColor: 'white',
overflow: 'hidden',
height: 116,
}} >
< Image
source={{
uri: 'https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg',
}}
style={{width: 107, backgroundColor: '#eee'}}
/ >
< View
style={{
marginVertical: 16,
marginHorizontal: 12,
flex: 1,
justifyContent: 'space-between',
}} >
< View >
< Text style={{fontSize: 14, color: '#222', fontWeight: '500'}} >
万柳书院新一区 南北向满五唯一
< /Text >
< Text style={{fontSize: 11, color: '#222', marginTop: 8}} >
4室2厅/278.35㎡/南 北/万柳书院
< /Text >
< /View >
< View
style={{flexDirection: 'row', marginTop: 8, alignItems: 'flex-end'}} >
< Text
style={{
fontSize: 17,
color: '#E62222',
fontWeight: 'bold',
}} >
4238万
< /Text >
< Text style={{fontSize: 11, color: '#999', marginLeft: 6}} >
155,445元/平
< /Text >
< /View >
< /View >
< /View >
Flutter
flutter
复制代码
SwiftUI
swift
复制代码
HStack(spacing:0) {
AsyncImage(url: URL(string: "https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg"))
.frame(width:107)
.aspectRatio(contentMode: .fill)
.clipped()
VStack(alignment: .leading,
spacing:0) {
VStack(alignment: .leading,
spacing:0) {
Text("万柳书院新一区 南北向满五唯一")
.lineLimit(1)
.font(.system(size: 14))
.foregroundColor(.black)
.fontWeight(.bold)
Text("4室2厅/278.35㎡/南 北/万柳书院")
.lineLimit(1)
.font(.system(size: 12))
.foregroundColor(.black)
.padding(.top, 8)
}
Spacer()
HStack(alignment: .bottom,
spacing:2) {
Text("4238万")
.font(.system(size: 14))
.foregroundColor(.red)
.fontWeight(.bold)
Text("155,445元/平")
.font(.system(size: 12))
.foregroundColor(.secondary)
.padding(.leading, 2)
}
}
.padding(.vertical, 16)
.padding(.horizontal, 12)
Spacer()
}
.frame(height: 116)
.background(.white)
.clipShape(RoundedRectangle(cornerRadius: 8))
.padding(.horizontal, 16)
}
ArkUI
typescript
复制代码
Row() {
Row() {
Image("https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg")
.width(107)
.height("100%")
.objectFit(ImageFit.Cover)
Column() {
Column() {
Text("柳书院新一区 南北向满五唯一")
.fontSize(16)
.fontColor("#222")
.maxLines(1)
Text("4室2厅/278.35㎡/南 北/万柳书院")
.fontSize(14)
.fontColor("#222")
.maxLines(1)
.margin({ top: 8 })
}
.alignItems(HorizontalAlign.Start)
Row() {
Text("4238万")
.fontSize(15)
.fontColor("#E62222")
.fontWeight(FontWeight.Bold)
Text("155,445元/平")
.fontSize(13)
.fontColor("#222")
.margin({ left: 2 })
}
.justifyContent(FlexAlign.Start)
.alignItems(VerticalAlign.Bottom)
}
.width("100%")
.height("100%")
.padding({ top: 16, bottom: 16, left: 12, right: 12 })
.alignItems(HorizontalAlign.Start)
.justifyContent(FlexAlign.SpaceBetween)
}
.borderRadius(8)
.margin({ left: 16, right: 16 })
.backgroundColor(Color.White)
.justifyContent(FlexAlign.Start)
.clip(true)
}
.height(116)
.width("100%")
`HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿`
小结
- 从上面的例子可以看出来,声明式语法只需要我们描述UI长什么样就行。不需要做太多布局计算的工作,让我们少掉一些头发
- ArkUI和SwiftUI的语法最像,甚至它们的状态管理也很像,都是提供了状态绑定和监听机制来更新UI样式
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
开发
+关注
关注
0文章
370浏览量
40844 -
代码
+关注
关注
30文章
4788浏览量
68616 -
鸿蒙
+关注
关注
57文章
2352浏览量
42859
发布评论请先 登录
相关推荐
鸿蒙:我来了!安卓:那我走?
(简称TS)/JavaScript(简称JS)为主要编程语言的声明式UI框架(ArkUI 3.0)。同时,ArkCompiler 3.0增加了对TS/JS语言的支持,HarmonyOS
发表于 11-05 15:51
HarmonyOS应用开发-ArkUI声明式UI工程体验与分享
声明式UI工程体验1. 创建工程说明:声明式UI工程目前仅在API7才能使用 选择 选择eTS语言 创建完成后,这是该目录,其中common目录和model目录需要自行创建即
发表于 12-08 10:22
HarmonyOS应用开发-ArkUI声明式UI页面布局、跳转与返回的实现
页面跳转声明式UI范式提供了两种机制来实现页面间的跳转:1. 路由容器组件Navigator,包装了页面路由的能力,指定页面target后,使其包裹的子组件都具有路由能力。2. 路由
发表于 12-09 11:42
课程预告丨12月15日官方直播带你领略ArkUI的声明式开发范式之美
方舟开发框架(ArkUI)的声明式开发范式有什么优势?Java/JS/eTS(extended TypeScript)三种语言,用哪种语言更好?12月15日 19:00-20:30,H
发表于 12-10 17:52
Hello HarmonyOS学习笔记:分布式新闻客户端实战(JS、eTS)
开发框架(ArkUI),其中JAVA UI框架是基于Java拓展的命令式开发,方舟开发框架是基于JS拓展的类Web开发范式(俗称响应式)或T
发表于 06-23 20:08
4天带你上手HarmonyOS ArkUI开发——《HarmonyOS ArkUI入门训练营之健康生活实战》
开发者快速提升技能实力进阶。目标学员入门开发者(计算机专业相关)学习链接:https://t.elecfans.com/c2241.html训练营目标通过学习ArkUI入门训练营课程,了解声明式UI开发
发表于 01-05 11:49
HarmonyOS/OpenHarmony应用开发-ArkTS的声明式开发范式
基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、跨设备应用的UI开发框架,支持开发者高效的构建跨设备应用UI界面。基础能力使用基于ArkTS的声明
发表于 01-17 15:09
HarmonyOS/OpenHarmony应用开发-声明式开发范式组件汇总
组件是构建页面的核心,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。组件之间相互独立,随取随用,也可以在需求相同的地方重复使用。声明式开发范式目前可供选择的组件如下表所示。组件
发表于 01-19 11:14
2022年HarmonyOS/OpenHarmony生态观察
持续基于声明式开发体系和三大理念长期演进,全方面发展鸿蒙应用生态。在整体流程上,华为从设计&gt;开发&
发表于 01-19 13:10
OpenHarmony应用开发-ArkUI方舟开发框架简析
构建UI,主要基于以下几点考虑:
开发效率: 声明式开发范式更接近自然语义的编程方式,开发者可以直观地描述UI,无需关心如何实现UI绘制和渲染,开发高效简洁。
应用性能: 如下图所示,
发表于 04-23 09:35
JavaScript JavaScript是什么语言
JavaScript是属于开发Web页面的脚本编程语言,是一种具有函数优先的轻量级编程语言。JavaScript基于原型编程、多范式的动态脚本语言,并且支持面向语言、
华为推出新声明式 UI 开发框架(ArkUI)
今年的 HDC 华为开发者大会 2021,华为又双叒推出新的声明式 UI 开发框架(ArkUI),咋说呢,学无止境啊,更新速度堪比坐火箭。
HarmonyOS基于 ArkUI 中 TS 扩展声明式开发范式
本来计划要做一个本地数据库存储相关的项目,但是官方的小伙伴给我说,ArkUI 数据库目前不支持最新的模拟器,所以只能另想其他的。
评论