组件

组件分类:容器组件、基础组件

常见容器组件

  • build
  • Column
  • Row
  • Flex(弹性布局)
  • Grid(格栅布局)
  • Tabs(选项卡)
  • Scroll
  • Stack(层叠布局)
  • List (列表布局)
  • RelativeContainer(相对布局)
  • Swiper(轮播)

常见基础组件

  • Text
  • Button
  • Image
  • Badge(角标组件,常配合image组件使用,只可放图片的左、右和右上的位置)
  • TextInput
  • checkBox
  • Blank (填充组件)
  • Span (常用于Text组件,拼接不同样式的字符串)

属性

通用属性

如:宽高、背景色、padding、margin、layoutWeight、border、borderradius......

border({width: 1, color: xxx, style: Borderstyle.Solid})

  • 对象形式,默认是Solid实线,可选Dashed虚线和Dotted点线
  • 也可通过left、right、bottom、top 配置四个方向的边框

borderradius

  • borderRadius(数值)四个角圆角相同
  • borderRadius({方位词:值})单独给某个角设置圆角
  • 设置正圆需要数值设置成宽高的一半,宽高需要相同。
  • 胶囊形状需要设置成容器高度的一半

backgroundImage(路径,是否平铺:ImageRepeat枚举) X表示横向平铺,Y表示纵向平铺,XY表示横纵都平铺

backgroundImagePosition

  • 传入对象,设置位置坐标,以背景图片的左顶点为基准
    {x:坐标值,y:坐标值}
    注意:坐标值单位目前版本已经和宽高单位改成一致了,但是可了解一下不同单位的区别(见下一讲vp和px)
  • Alignment枚举,设置一些特殊的位置(中央、左顶点...)
    Center TopStart左顶点 TopEnd右顶点 BottomEnd右下

backgroundImageSize

  • 直接写宽高尺寸 对象 (用width: xx, height: xx)
  • 设置 背景尺寸 的枚举 ImageSize
    Auto:默认,原图尺寸
    Contain:等比例缩放背景图,当宽或高与组件尺寸相同停止缩放
    Cover:等比例缩放背景图至图片完全覆盖组件范围(常用
    FILL:不等比缩放背景图至图片完全覆盖组件范围,但会拉伸图片,使图片变形。

layoutWeight

  • 设置layoutWeight 属性的 子元素 与 兄弟元素,会 按照权重 进行分配 主轴 的空间
  • 自适应伸缩:按照[份数(权重)]分配 [剩余空间]
  • 使用layoutWeight时不可再使用width或height,因为其组件需要按照份数占一定比例。

position 定位

  • position绝对定位:可以控制组件位置,可以实现层叠效果
语法:position({x: ,y: })
  • 特点:
    1.相对于父组件左顶点进行偏移(调整位置)
    2.原本的位置不占了,且可以任意调整位置,不影响其他元素
  • 默认后面的组件层级更高,会盖住前面的组件
    需求:不动结构的情况下,调整组件的层级用:.zIndex(数字)
    注意:zIndex(数字) 数字越大,显示层级越高

opacity 透明度

  • 0表示全透明,1表示不透明

scale 缩放

  • scale({x: 1,y: 1}) 1表示原尺寸,0表示最小

animatioin 动画

  • 对象形式duration: 数值 (动画持续的时间)

aspectRatio

  • 设置和图片一致的宽高比,保证图片正常适配
  • aspectRatio(2.4) (宽/高 得出)

特殊属性

见下组件中详细介绍

Text:

  • fontSize(16) 默认大小16
  • fontWeight(FontWeight.Bold) 括号内也可用100-900数值表示,加粗通常用700,默认400
  • fontColor(Color.Red) 括号内也可以直接输入16进制代码如:'#00df3c20' (前两位为透明度,0全透明,1不透明
  • textOverflow({}) 设置文字溢出(必须配合maxlines使用才有效果)
textOverflow({ //设置文字溢出 (注意,传的是对象,要加大括号!属性名是overflow)
  overflow: TextOverflow.Ellipsis //文字溢出显示省略号(重要!!!)
  //overflow: TextOverflow.MARQUEE // 显示单行滚动效果
})
  • maxlines(2) 主要作用于上面的Ellipsis和clip/none属性,若是MARQUEE属性,则不需要添加最大行数。
  • textAlign(TextAlign.Center) 设置文字对齐方式

TextInput(参数对象).属性方法

  • type(InputType.xxx) 设置输入框type类型,xxx可以是Normal或Password,表示基本输入模式和密码输入模式
  • 参数对象:placeholder: 提示文本

容器组件中的特殊属性见下布局中详细解释

布局

注:容器组件放在build下,build下同级只能有一个容器组件!

1. 线性布局(Column+Row)

控制容器内组件的间距,可以用“space”给容器组件设置。

justifyContent(FlexAlign.xxx) 设置排布主方向的对齐方式(主轴)

  1. Start (排布主方向)主轴起始位置对齐
  2. Center 主轴居中对齐
  3. End 主轴结束位置对齐 (居底)
  4. SpaceBetween 子元素两边元素贴边显示,中间的元素均匀分布间隙(常用
  5. SpaceAround 间隙环绕 (0.5 1 1 1 0.5的间隙分布) 靠边只有一半的间隙
  6. SpaceEvenly 间隙均匀环绕,靠边也是一份间隙(1 1 1 1 1)

alignItems() 交叉轴对齐方式

  1. alignItems(HorizontalAlign.Start) Center End —— Column的交叉轴对齐方式(水平往右)
  2. alignItems(VerticalAlign.Top) Center Bottom —— Row的交叉轴的对齐方式(垂直往下)

2. 弹性布局(Flex)

  1. 主轴方向:direction 默认row(主轴水平往右,交叉轴往下)
  2. 主轴对齐方式:justifyContent FlexAlign.SpaceAround / ......
  3. 交叉轴对齐方式:alignItems alignItems: ItemAlign.Stretch / Start / Center / End(Stretch表示交叉轴拉伸(交叉轴拉伸铺满屏幕))
  4. 布局换行:wrap

wrap属性:Flex 是单行布局还是多行布局

  • FlexWrap.noWrap 单行布局
  • FlexWrap.Wrap 多行布局

注:

FlexWrap.noWrap 不换行(若不换行,则会撑开盒子)
flex布局主要用于不规则组件需要换行的场景,线性布局是不支持换行的。

3. 层叠布局(Stack)

层叠布局具有较强的组件层叠能力。场景:卡片层叠效果等

特点:层叠操作更简洁,编码效率高。(绝对定位的优势是更灵活)

语法:
Stack({alignContent: Alignment.Center}){ //可以方便调整层叠元素的位置
   Item1()
   Item2()
}  

alignContent有九个位置可以选(类似于九宫格)

4. 格栅布局(Grid)

在规则的行列布局中非常常见,如3行4列

  • 本质是用Grid包裹多个GridItem
  • 每个GridItem底下只能有一个Column或Row(子容器)
Grid(){
  ForEach([1,2,3,4,5,6,7,8,9,10,11,12], () => {
    GridItem(){  //本质是用Grid包裹多个GridItem
      Column(){   //每个GridItem底下只能有一个Column或Row(子容器)
      }
    }
  })
}

.columnsTemplate('1fr 1fr 1fr 1fr') 用来控制有多少列和每列的所占份数
.columnsGap(5) 控制每列之间的间隙
.rowsTemplate('1fr 1fr 1fr') 用来控制有多少行和每行的所占份数
.rowsGap(5) 控制每行之间的间隙

注:通常使用Foreach来循环遍历GridItem,用于重复样式不同内容的组件
 

其余常用容器组件

Swiper(轮播)

Swiper是一个 容器组件,当设置了多个子组件后,可以对这些子组件进行轮播显示。(文字、图片)

  • .loop(true) //开启循环,默认开启
  • .autoPlay(true) //开启自动播放,默认关闭
  • .interval(5000) //自动播放间隔,默认3000
  • .vertical(true) //纵向轮播

        定制小圆点

  • .indicator(true) true或者false可以显示/隐藏小圆点
  • 在indicator()括号内使用Indicator.dot()找到小圆点,对其属性进行设置
  • .itemWidth(20) 默认的宽(未选中的)
  • .itemHeight(20) 默认的高(未选中的)
  • .color('#ccc') 默认的颜色
  • .selectedItemWidth(25) 选中的宽
  • .selectedItemHeight(25) 选中的高
  • .selectedColor(Color.White) 选中的颜色

Scroll(滚动容器)

当子组件的布局尺寸 超过Scroll的尺寸时,内容可以滚动

用法:

1. Scroll设置尺寸

设置溢出的子组件(只支持一个子组件)

滚动方向(支持横向和纵向,默认纵向)

2. Scroll常见属性

① scrollable 设置横向/纵向滚动(默认纵向)

② scrollBar 设置滚动条显隐(On显示,Off隐藏,Auto滑动时显示)

③ scrollBarColor 设置滚动条颜色

④ scrollBarWidth 设置滚动条宽度

⑤ edgeEffect 设置滑动效果(Spring弹簧,Fade阴影)

3. Scroll控制器

步骤:

1. 实例化Scroller 的控制器

2. 绑定给Scroll组件

3. 控制器方法 控制滚动,控制器属性 获取滚动距离

  • 属性:currentOffset().yOffset/xOffset 获取滚动距离
  • 方法:
  1. scrollEdge(Edge.Top/Bottom) 自动滚动到顶部/底部
  2. scrollPage({next: true/false}) 翻到下一页/上一页

4. Scroll事件

         Scroll组件提供了一些事件,让开发者可以在适当的时候添加逻辑

        .onWillScroll()和.onDidScroll() 分别为滚动前触发滚动时触发

Tabs(选项卡容器)

当页面内容较多时,可通过Tabs组件进行分类展示

1. Tabs基本用法

  • Tabs({barPosition: BarPosition.End}) 括号内用对象枚举形式控制导航条的位置,位置只有EndStart两种,分别为顶部和底部
  • Tabs内包裹多个TabContent(),每个TabConetnet内存放一个结构。其属性tabBar设置每个选项卡的内容

2. 常用属性

① barPosition:调整位置 开头 或 结尾(参数)
② vertical: 调整导航 水平 或 垂直
③ scrollable: 调整是否 手势滑动 切换
④ animationDuration: 点击滑动动画时间

3. 滚动导航栏

  • 如果导航栏的内容较多,屏幕无法容纳时,可以将他设置为滚动
  • 可以通过Tabs组件的barMode属性即可调整 固定导航栏滚动导航栏

4. 自定义导航栏

TabBar在底部,一般会显示 图形和文字,甚至有特殊图标。可以用@Builder封装好内容结构后通过tabBar进行渲染。

5. 常用监听事件

  • onTabBarClick() 只有点击切换的时候才触发事件,滑动切换不触发
  • onChange() 滑动和点击切换 都触发监听事件

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐