一、总览
1.Column
2.Row
3.Flex
4.Stack
5.Swiper
6.Grid
7.Scroll
8.Tabs
9.Badge
10.WaterFlow
11.List
二、详解
2.1 Colunm
column是线性布局中最常用的布局方式之一,column容器内子元素按照垂直方式排列。主轴方向为垂直方向。可以通过space属性设置布局主方向上子元素的间距,使各子元素在布局上有等间距效果(不能控制子元素到容器边缘的间距)。
2.2 Row
Row也是线性布局中最常用的布局之一,row容器内子元素按照水平方向排列。主轴方向为水平方向。Row也可以通过space设置子元素的间距。
2.3 Flex
Flex的wrap属性控制当子元素尺寸之和大于容器主轴尺寸时,Flex是单行布局还是多行布局。在多行布局时,通过交叉轴方向确认新行排列。
2.4 层叠(堆叠)布局
层叠布局通过Stack容器组件实现位置的固定与层叠,容器中的子元素依次入栈,后一个子元素覆盖前一个子元素,子元素可以叠加,也可以设置位置。
子元素的显示级数可以通过ZIndex(数字)控制,数字越大,显示级数越高。
可以通过 alignContent 来设置子组件的位置。
2.5 Swiper
2.5.1 概述
Swiper是一个轮播图组件,可以对设置的多个子组件进行轮播展示。
Swiper如果设置了尺寸,内容会拉伸为和Swiper一致(优先级高),如果设置内容尺寸,会将Swiper撑开。
Swiper的子组件(图片地址,一般是网络地址)有两种完成方式:一种是在Swiper组件内直接使用Image写入图片地址,另一种是将图片地址写成数组,然后使用ForEach循环遍历这个数据。。
2.5.2 Swiper常用属性
a. loop 是否开启循环,设置为true时表示开启循环,默认值为true。
b. autoPlay 子组件是否自动播放。默认值为false。 loop为false时,自动轮播到最后一页时停止。
c. interval 使用自动播放时播放的时间间隔,单位为毫秒。默认3000
d. vertical 是否纵向滑动。默认false
2.5.3 导航点
.indicator(false) //关闭导航点
**.indicator(
Indicator.dot()
.xxx(设置圆点指示器的属性)
) // 圆点指示器(默认)**
导航点的位置可以通过left、rigght、top、buttom设置四个方向的距离。
itemWith和itemHight 设置Swiper组件圆点导航指示器的宽高,不支持设置百分比,默认值6。
selectedItemWith和selectedItemHight 设置选中Swiper组件圆点导航指示器的宽高,不支持设置百分比,默认值12。
color 设置Swiper组件圆点导航指示器的颜色, selectedColor 设置选中Swiper组件圆点导航指示器的颜色。
.indicator(Indicator.digit()) // 数字指示器(了解)
2.6 Grid
2.6.1 概述
如果布局是由很多的行和列所组成(如计算器的键盘)。行列可能需要合并甚至滚动,就可以使用网格布局。
Gird内只能使用GridItem,需要展示的内容设置在GridItem内部,GridItem内只能有一个子组件。
网格布局可以分为如下几部分:1.固定行列(不滚动) 2.合并行列(不滚动) 3.设置滚动 4.代码控制滚动 5.自定义滚动条
1.固定行列(不滚动)
同时设置Gird的属性columnsTemplate和rowsTemplate,前者设置当前网格布局列的数量或最小列宽值,默认1列,例如 .columnsTemplate('1fr 2fr 1fr'),将父组件分为3列,父组件允许的宽分为4等份,第一列占一份,第二列占两份,第三列占一份,中间空格隔开,后者设置当前网格布局行的数量或最小行高值,默认1行,用法与前者相同。
columnsGap设置列与列之间的间距,rowsGap设置行与行的间距。
2.合并行列(不滚动)
使用FridItem的如下属性即可完成:
rowStart——指定当前元素起始行号
rowEnd——指定当前元素终点行号
columnStart——指定当前元素起始列号
columnEnd——指定当前元素终点列号
3.设置滚动
-
水平滚动:设置的是rowsTemplate,Grid的滚动方向为水平方向。
-
垂直滚动:设置的是columnsTemplate,Grid的滚动方向为垂直方向
4.代码控制滚动
核心步骤:
- 创建 Scroller 对象(控制器对象)
- 设置给 Grid
- 调用 Scroller 对象的 scrollPage 方法
// 1.创建 Scroller 对象(new 关键字,调用Scroller函数,返回一个Scroller的对象)
scroller: Scroller = new Scroller()
// 2.设置给 Grid
Grid(this.scroller) {
// ...
}
// 3.调用 Scroller 对象的 scrollPage 方法即可实现滚动
this.scroller.scrollPage({
next:true // 下一页
next:false // 上一页
})
5.自定义滚动条
核心步骤:
-
隐藏默认滚动条
scrollBar 设置滚动条状态 默认值:BarState.auto
BarState.off 关闭
BarState.on 常驻
BarState.auto 按需显示
-
使用ScrollBar组件自定义滚动条
a. ScrollBar 和 Grid 设置同一个 Scroller(控制器对象)
b. 通过 参数 和 属性控制 ScrollBar
scroller——可滚动组件的控制器。用于与可滚动组件进行绑定。
direction——滚动条的方向,控制可滚动组件对应方向的滚动。
state——滚动条状态。 默认值:BarState.Auto
ScrollBar({
scroller: this.scroller,// 和 Grid 同一个控制器对象
direction: ScrollBarDirection.Horizontal,
}) {
Text()
.width(40)
.height(20)
.backgroundColor(Color.Orange)
}
.width(200)
.height(20)
.backgroundColor(Color.Red)
2.7 Scroll
2.7.1 概述
可滚动的容器组件,当子组件的布局尺寸超过Scroll的尺寸时,内容可以滚动。 当页面内容由多个区域组成,并且可以滚动时,推荐使用 Scroll。Scroll只支持一个子组件。
2.7.2 属性
scrollable 设置滚动方向
scrollBar设置滚动条状态(一般关闭)
scrollWidth滚动条宽度
scrollColor颜色(宽度和颜色一般不设置)
edgeEffect 设置边缘滑动效果
2.7.3 Scroll的控制器
日常开发中可能需要通过代码控制滚动,以及获取滚动的距离,比如:
- 页面滚动超过一定距离,显示返回顶部(火箭),反之隐藏--获取滚动距离
- 点击返回顶部(火箭),返回顶部--代码控制滚动
可以通过Scroll的控制器实现,使用scrollEdge(滚动到边缘)和currentOffseet(返回当前偏移量)
Edge.Top和Edge.Start表现相同,Edge.Bottom和Edge.End表现相同。
this.scroller.currentOffset().xOffset // x 轴滚动距离 this.scroller.currentOffset().yOffset // y 轴滚动距离
-
创建 Scroller 控制器 scroller: Scroller = new Scroller()
-
设置给Scroll Scroll(this.scroller) { // 内容略 }
onScroll(event: (xOffset: number, yOffset: number) => void) 滚动事件回调, 返回滚动时水平、竖直方向偏移量。结合 scroller的currentOffset方法 获取滚动距离。如超过一定距离显示返回顶部按钮,反之隐藏。
2.8 Tabs
2.8.1 概述
导航栏,常见于应用软件底部。
Tabs() { // 顶级容器
TabContent() {
// 内容区域:只能有一个子组件
}
.tabBar('首页') // 导航栏
}
.barMode(BarMode.Scrollable)// (导航栏)滚动
可以使用ForEach循环遍历数组循环渲染。
2.8.2 Tabs属性
- vertical 属性即可调整导航为 水平 或 垂直
- barPosition 即可调整导航位置为 开头 或 结尾
- scrollable 即可调整是否允许 页面滑动切换
- animationDuration 设置动画时间 毫秒
2.8.3 ### 2.4.2. 自定义 tabBar-Tabs组件的事件
实现高亮效果:
1.onChange(event: (index: number) => void) Tab页签切换后触发的事件。 index:当前显示的index索引,索引从0开始计算。滑动切换、点击切换 均会触发
2.onTabBarClick(event: (index: number) => void) Tab页签点击后触发的事件。index:被点击的index索引,索引从0开始计算。
2.9 Badge
2.9.1 概述
可以附加在单个组件上用于信息标记的容器组件(如微信消息提示红点),只支持单个子元素
Badge({count:0,style:{}}){
// 单个子元素
}
2.9.2 属性
count 设置消息提示数 小于等于0时显示红点
position设置提示点显示位置
maxCount 最大消息数,默认值99 style 设置文本颜色、尺寸、圆点颜色和尺寸
2.10 WaterFlow
2.10.1 概述
瀑布流容器,由“行”和“列”分割的单元格所组成,通过容器自身的排列规则,将不同大小的“项目”自上而下,如瀑布般紧密布局,比如淘宝首页商品页。
WaterFlow 组件的用法和Grid组件类似,这里只演示最核心的用法:实现竖直方向的瀑布流
WaterFlow({参数}) {
FlowItem() {
// 子组件
}
FlowItem() {
// 子组件
}
}
.属性()
2.10.2 常用参数
footer 设置WaterFlow尾部组件。
scroller 可滚动组件的控制器,与可滚动组件绑定。不允许和其他滚动类组件,如:List、Grid、Scroll等绑定同一个滚动控制对象。
2.10.3 常用属性
columnsTemplate、rowsTemplate、columnsGap、rowsGap、scrollBar、edgeEffect。
2.11 List
2.11.1概述
当列表项达到一定数量,超过List容器组件大小时,可以自动提供滚动功能.适合用于呈现同类数据类型或数据类型集,例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求(如通讯录、音乐列表、购物清单等)。List 表示列表容器,ListItem表示单个列表项,可以包含单个子组件
List() {
// 只能包含listItem
listItem() {
只能有一个根组件
}
.....
}
.scrollBar(BarState.Off)
三、布局
3.1 padding
在组件内添加间距,拉开内容与组件边缘之间的距离 .padding(数字或{})
- 对象{}:配合 left、right、top、bottom 单独设置某个方向内边距
3.2 margin
在组件外面添加间距,拉开两个组件之间的距离
.margin(数字或{}) 与padding类似
3.3 主轴
以 Row 为例,主轴在水平方向,交叉轴在垂直方向
justifyContent(枚举FlexAlign)
3.3 交叉轴
3.3.1 全部元素
以row为例
alignItems(枚举类型VerticalAlign)
注意:布局容器在交叉轴要有足够空间,否则无法生效
3.3.2 单个子元素交叉轴对齐方式
alignSelf(枚举ItemAlign)
3.4 自适应缩放
父容器尺寸确定时,设置了 layoutWeight 属性的子元素与兄弟元素占主轴尺寸按照权重进行分配。
layoutWeight(数字),只有一个子元素设置该尺寸数字可以大于等于1,但一般写1
3.5 定位
3.5.1 绝对定位
position,相对父组件左上角进行偏移
position( {x: 水平偏移量, y: 垂直偏移量} )
绝对定位特点:
- 参照父组件左上角进行偏移
- 绝对定位后的组件不再占用自身原有位置
3.5.2 相对定位
offset( {x: 水平偏移量, y: 垂直偏移量} )
3.6 背景属性
backgroundColor 背景色
backgroundImage 背景图 背景图平铺方式 ImageRepeat
背景图平铺方式:(可省略)
- NoRepeat:不平铺,默认值
- X:水平平铺
- Y:垂直平铺
- XY:水平垂直均平铺
backgroundImageSize 背景图尺寸
{width: 数值, height: 数值}(只设置宽或高,另一个尺寸等比例缩放)
backgroundImagePosition 背景图位置,默认显示位置为组件左上角
3.7 颜色渐变
3.7.1 线性渐变
linearGradient({
angle?: 线性渐变的起始角度,
direction?: 线性渐变的方向,
colors: [[颜色1, 颜色1所处位置], [颜色2, 颜色2所处位置], ......],
repeating?: 是否重复着色
})
3.7.2 径向渐变
radialGradient({
center: 径向渐变的中心点坐标,
radius: 径向渐变的半径,
colors: [[颜色1, 颜色1所处位置], [颜色2, 颜色2所处位置], ......],
repeating?: 是否重复着色
})
3.8 阴影
shadow({
radius: 模糊半径,
type?: 阴影类型,
color?: 阴影颜色,
offsetX?: X轴偏移,
offsetY?: Y轴偏移,
fill?: 是否内部填充
})
3.9 多态样式
.stateStyles({
pressed: {
.width(200)
}
})
3.9.1 参数
normal 组件无状态时的样式(默认状态)
pressed 组件按下状态的样式
disabled 组件禁用状态的样式
focused 组件获焦状态的样式
clicked 组件点击状态的样式
3.10 动画 animation
可以通过属性动画实现渐变过渡效果,提升用户体验。支持的属性包括width、height、backgroundColor、opacity、scale、rotate、translate等。
.animation({
duration: 2000,
// 速度曲线
curve: curves.springMotion(),
delay: 1000,
iterations: -1
})
3.10.1 参数
duration 设置动画时长。
默认值:1000
单位:毫秒
curve 设置动画曲线
默认值:Curve.EaseInOut
delay 设置动画延迟执行的时长。
默认值:0,不延迟播放。
单位:毫秒
iterations 设置播放次数。
默认值:1
设置为-1时表示无限次播放。设置为0时表示无动画效果。
3.11 图形变换
3.11.1 平移
可使组件在以组件左上角为坐标原点的坐标系中进行移动
.translate({x: 100})
3.11.2 缩放
分别设置X轴、Y轴、Z轴的缩放比例,默认值为1
.stateStyles({
normal: {
.scale({x:1, y: 1})
},
pressed: {
.scale({x: 0.8, y: 0.8})
}
})
3.11.3 旋转
可使组件进行旋转
.stateStyles({
normal: {
.rotate({angle: 0})
},
pressed: {
.rotate({angle: 60})
}
})