harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)

简介: 本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。

大家好!我是黑臂麒麟,一位6年的前端;

if you're change the world, you're workingon important things. you're excited to get up in the norning.

一、常用基础组件

1.基础组件

简单列举常用的及含义,掌握了以下按钮可以解决日常简单场景需求。其他在使用时查询ArkTSAPI文档即可。
| 组件 | 含义 |
|-----|----|
| Text() | 显示一段文本的组件。 |
| Image() | 图片组件,支持本地图片和网络图片的渲染展示 |
| TextInput() | 单行文本输入框组件。|
| Button() | 按钮 |
| Blank | 空白填充组件,在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column时生效。 |
| LoadingProgress| 显示加载进展 |
| ...||

2.文本样式

ArkTS的样式以驼峰命名方式,这里以Text组件为例:
|名称|参数类型|描述|
|--|--|--|
|fontColor|ResourceColor|设置文本颜色|
|fontSize| Length or Resource | 设置文本颜色|
fontStyle|FontStyle|设置文本的字体样式。默认值:FontStyle.Normal。|
fontWeight|numbe or FontWeight or string| 设置文本的字体粗细,number类型取值[100, 900],取值间隔为100,默认为400,取值越大,字体越粗。string类型仅支持number类型取值的字符串形式,例如“400”,以及“bold”、“bolder”、“lighter”、“regular”、“medium”,分别对应FontWeight中相应的枚举值。默认值:FontWeight.Normal。 |

下面代码是两个Text组件,分别是默认样式和设置了文本样式的对比。

@Entry
@Component
struct Index {
   
  @State message: string = 'Hello World';
  @State myText: string = 'World';

  build() {
   
    Row() {
   
      Column(){
   
        Text('ArkTs')
        Text('ArkTs')
          .fontColor(Color.Blue)
          .fontSize(40)
          .fontWeight(FontWeight.Bold)
          .fontFamily('Arial')
      }
    }
    .justifyContent(FlexAlign.Center)
    .backgroundColor(0xF1F3F5)
    .width('100%')
    .height('100%')
  }
}

在这里插入图片描述
以上ArkTs代码的样式使用驼峰格式;其他组件的样式也是一样。使用时查阅具体用法。

3.Image

这里着重说一下Image的图片地址的引入方式,方式如下:
Image(src: string|PixelMap|Resource)
(1).使用string数据加载网络图片

 Image(‘https://www.example.com/xxx.png’)

这里要注意Image在使用网络图片的时候,需要要在module.json5文件中声明网络访问权限

  // module.json5
  {
   
    "module": {
   
         "requestPermissions": [
            "name": "ohos.permisssion.INTERNET"    
        ]
    }
}

(2).使用PixelMap数据加载图片

Image(pixelMapObject)

(3)使用Resource数据加载图片

Image($r('app.media.logo'))

上面的Resource是一种资源引入类型。会在下面详细描述。

4.使用资源引用类型

Resource是资源引用类型,用于设置组件属性的值。ArkTs文档推荐优先使用Resource类型,将资源文件(字符串、图片、音频等)统一存放于resources目录下,便于开发者统一维护。同事系统可以根据当前配置加载合适资源,例如,开发者根据屏幕尺寸呈现不同的布局效果,或根据语言提供不同的字符串。
已上面Text组件代码为例:

Text('ArkTs')
  .fontColor(Color.Blue)
  .fontSize(40)
  .fontWeight(FontWeight.Bold)
  .fontFamily('Arial')

(1).对元素内文本字符串的管理;

可以将这些编码写到entry/src/main/resources下的资源文件中。
在这里插入图片描述
在string.json中定义Button显示的文本
在这里插入图片描述
就个人而言,不太喜欢这种方式相对于前端喜欢而言。
float.json中定义Text的字体样式。
在这里插入图片描述
在color.json中定义Text的字体颜色。
在这里插入图片描述
然后再Text组件通过$r('app.type.name)的形式引用应用资源。app带表应用内resources目录中定义的资源;type代表资源类型(或资源的存放位置),可以取“color”,“float”、“string”、“plural”、“media”; 以上几种是固定的,不支持自定义命名文件引用。name代表资源命名,由开发者定义资源时确定的。

Text($r('app.string.Index_Text'))
  .fontColor($r('app.color.Text_color'))
  .fontSize($r('app.float.Text_fontSize'))
  .fontWeight(FontWeight.Bold)
  .fontFamily($r('app.float.Text_fontFamily'))

以上是简单的描述Resource引用方式,后面回单独出一期深入研究的Resource引入文章。

二、布局组件

前端常用布局方式header、side、main、footer等标签,还有布局样式flexgrid等,在ArkTs常用布局组件有一下几种:
|组件|描述|
|--|--|
|Column|垂直方向布局的容器|
|Row|水平方向布局的容器|
|List|列表容器|
|Grid|网格容器|
|Tabs|页签容器|
|Swiper|滑块视图容器|
|Scroll|可滑动的容器|

这里说一下ListGridTabsColumnRow使用方法,Swiper、Scroll布局组件相对简单详见Api文档。有点类似小程序的类似组件。

1. Column&Row

布局容器概念

线性布局容器表示垂直方向或者水平方向排列子组件的容器,ArkTs提供了ColumnRow容器来实现线性布局。

主轴和交叉轴概念

在布局容器中,默认存在两根轴,分别是主轴和交叉轴,这两个轴始终是相互垂直的。不同的容器中主轴的方向不一样的。

  • 主轴:在Column容器中的子组件是按照从上到下的垂直方向布局,其主轴的方向是垂直方向;在Row容器中的组件时按照从左到右的水平方向布局的,其主轴的方向时水平方向。
    下图时Column&Row容器交叉轴
    在这里插入图片描述

    属性

    Column&Row容器的两个属性justifyContent和alignItems,类似CSS的flex或Grid的justify-content和align-item。这样容易让我们前端快速理解。
    这里注意一下它们的属性值都要首字母大写
    |属性名称|描述|
    |--|--|
    |justifyContent|设置子组件在主轴方向上的对齐格式|
    |alignItems|设置子组件在交叉轴方向上的对齐格式|

    主轴方向的对其(justifyContent)

    子组件在主轴方向上的使用jusifyContent属性来设置,其参数类型时FlexAlign。它有一下几种类型:
    |属性值|描述|
    |--|--|
    |Start|主轴方向首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐|
    |Center|主轴方向中心对齐,第一个元素与行首的距离以及最后一个元素与行尾距离相同|
    |End|主轴方向尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐|
    |SpaceBetween|主轴方向均匀分配弹性元素,相邻元素之间距离相同。 第一个元素与行首对齐,最后一个元素与行尾对齐|
    |SpaceAround|轴方向均匀分配弹性元素,相邻元素之间距离相同。 第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半|
    |SpaceEvenly|主轴方向等间距布局,无论是相邻元素还是边界元素到容器的间距都一样|
  • Start
    在这里插入图片描述
  • Center
    在这里插入图片描述

  • End
    在这里插入图片描述

  • SpaceBetween
    在这里插入图片描述

  • SpaceAround
    在这里插入图片描述

  • SpaceEvenly
    在这里插入图片描述

    交叉中方向对齐(alignItems)

    Column容器的主轴时垂直方向,交叉轴是水平方向,其参数类型为HorizontalAlign(水平对齐),HorizontalAlign定义了一下几个类型;
    |属性值|描述|
    |--|--|
    |Start|水平方向上按照起始端对齐|
    |Center|水平方向上居中对齐|
    |End|水平方向上按照末端对齐|

  • start
    在这里插入图片描述

  • Centent
    在这里插入图片描述

  • End
    在这里插入图片描述
    Row容器的主轴是水平方向,交叉轴是垂直方向,其参数类型为VerticalAlign(垂直对其),VerticalAlign定义了一下几种类型:
    |属性值|描述|
    |--|--|
    |Top|垂直方向上居顶部对齐|
    |Center|竖直方向上居中对齐|
    |Bottom|竖直方向上居底部对齐|

  • Top
    在这里插入图片描述
  • Center
    在这里插入图片描述
  • Bottom
    在这里插入图片描述

    接口介绍

    Column&Row都课接收一个参数space,表示子组件在主轴上的间距;

    @Entry
    @Component
    struct Index {
         
    @State TextArr: Array<string> = ["Image", "Text", "TextInput", "Button"]
    
    build() {
         
      Column({
         space: 30}) {
          // 这里设置子元素主轴上的间距
        ForEach(this.TextArr, (item: string)=> {
          // 利用ForEach渲染我们的字符串数组
          Row(){
         
            Text(item)
          }
          .width('80%')
          .height('100vp')
          .backgroundColor('#99b2df')
          .border({
         
            width: 5,
            color: '#8aa7da',
            style: BorderStyle.Solid
          })
          .justifyContent(FlexAlign.Center)
        })
      }
      .justifyContent(FlexAlign.Start)
      .backgroundColor('#bdd7ee')
      .width('100%')
      .height('100%')
    }
    }
    

    渲染出来的效果:
    在这里插入图片描述

3. List使用

简介

使用频率很高的组件,需要配合ListItem子组件一起使用,列表每项对应一个ListItem组件
在这里插入图片描述

使用ForEach渲染

渲染多时,可以使用ForEach来循环渲染我们的列表项;

@Entry
@Component
struct Index {
   
  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  build() {
   
    Column({
   space: 30}) {
   
      List({
   space: 10}) {
   
        ForEach(this.arr, (item: number)=> {
   
          ListItem(){
   
            Text(`${
     item}`)
              .width('100%')
              .height(100)
              .fontSize(20)
              .fontColor(Color.White)
              .textAlign(TextAlign.Center)
              .backgroundColor(0x007DFF)
          }
        }, item => item)
      }
    }
    .padding(12)
    .height('100%')
    .backgroundColor(0xF1F3F5)
  }
}

在这里插入图片描述

设置分割线

这里如有需求可以给list组件可以使用divider属性给ListItem设置分割线。有四个参数:

  • strokeWidth: 分割线宽度
  • color: 分割线颜色
  • startMargin: 分割线距离列表起始端的距离
  • endMargin: 分割线距离列表结束端的距离

    List({
         space: 50}) {
         
    ForEach(this.arr, (item: number)=> {
         
    ListItem(){
         
     Text(`${
           item}`)
    }
    }, item => item)
    }
    .divider({
         
    strokeWidth: 5,
    color: '#d8d8d8',
    startMargin: 20,
    endMargin: 20,
    })
    

    在这里插入图片描述

    列表滚动事件监听

    List滚动监听事件和前端监听Scroll监听时间方法很像:

  • onScroll: 滑动触发,返回scrollOffset为滑动偏移量,scrollState为当前滑动状态。

  • onScrollIndex: 滑动时触发,分别返回滑动起始索引值与滑动结束索引值。
  • onReachStart: 列表到达起始位置时触发。
  • onReachEnd: 列表到底末尾位置触发。
  • onScrollStrop: 列表滑动结束时触发。
    在这里插入图片描述
    利用这些时间监听,并可以在log面板中打印出我们想要的滑动数据;

    设置List排列方向

    List组件排列可以垂直方向和水平方向排列,默认是垂直方向排列。如果想设置List为水平方向,可以使用listDiretion属性为Axis.Horizontal即可。

4. Grid

简介

如果前端学过css的grid布局模式,那大家一定不会对Grid组件布局陌生,接下来学习如何使用Grid网格布局组件。

使用

Grid组件是由“行”和“列”分割的单元格组成。Grid一般和GridItem一起使用。

@Entry
@Component
struct GridPage {
   
  private arr: string[] = new Array(9).fill('').map((_, index) => `item ${
     index + 1}`)

  build() {
   
    Column() {
   
      Grid() {
   
        ForEach(this.arr, (item: string) => {
   
          GridItem(){
   
            Text(item)
              .fontSize(16)
              .fontColor(Color.White)
              .backgroundColor(0x007DFF)
              .width('100%')
              .height('100%')
              .textAlign(TextAlign.Center)
          }
        }, (item: string) => item)
      }
      .columnsTemplate('1fr 1fr 1fr')
      .rowsTemplate('1fr 1fr 1fr')
      .columnsGap(10)
      .rowsGap(10)
      .height(300)
    }
    .width('100%')
    .padding(12)
    .backgroundColor(0xF1F3F5)
  }
}

在这里插入图片描述
这里我们同样跟List一样使用ForEach遍历出的数组,可以看到我们设置columnsTemplate属性垂直方向配置3等分个1fr,同样纵向rowsTemplate也是3等分的1fr1fr代表所占Grid等分个数。columnGaprowGap分别设置垂直和纵向元素之间的间距。这里分别设置了 10vp

5. Tabs

概述

Tabs是我们常用的做视图切换的常用布局组件。如“底部页签”,“顶部标签”,平板的“侧边页签”等。

使用

Tabs组件仅含子组件TabContent,每一个页签对应内容视图即TabContent组件。
结合之前我们写的ListGrid的组件,我们编写一个简单的Tabs布局

import Home from '../view/Home';
import GridPage from '../view/GridPage'
@Entry
@Component
struct Index {
   
  private controller: TabsController = new TabsController();

  build() {
   
    Column() {
   
      Tabs() {
   
        TabContent() {
   
          Home()
        }
        .tabBar('List')

        TabContent() {
   
          GridPage()
        }
        .tabBar('Grid')
      }
      .barWidth('100%') // 设置TabBar宽度
      .barHeight('60') // 设置TabBar高度
      .width('100%') 
      .height('100%')
      .backgroundColor(0xF5F5F5)
    }
    .width('100%')
    .height('100%')
  }
}

展示后的效果
在这里插入图片描述
在这里插入图片描述
上面代码,通过属性widthheight设置了Tabs组件的宽高,使用TabWidthBarHeight设置了TabBar的宽度和高度。
在这里插入图片描述

设置TabBar布局属性

Tabs布局模式默认Fixed的,不支持滑动。如果页签过多会可能导致显示不全,讲布局模式设置为Scrollable的话,可以实现页签的滚动。
|布局属性|描述|属性值|
|--|--|--|
|barMode|Tabs的布局模式| BarMode.Fixed (默认):所有TabBar平均分配barWidth宽度。
BarMode.Scrollable: 每个TabBar使用实际宽度,超过总长度后可滑动。 |
|barPosition|设置TabBar位置和排列方向|BarPosition.Start,vertical属性为false(默认值)时,页签在顶部.vertical属性为true时,位于容器左侧。
BarPosition.End, vertical属性为false时,位于容器底部。vertical属性为true时,位于容器右侧。

自定义TabBar样式

如果需要自定义TabBar, 需要通过@Builder装饰器的函数。构造一个生成自定义TabBar样式的函数,我们来实现上面底部页签效果:

import Home from '../view/Home';
import GridPage from '../view/GridPage'
@Entry
@Component
struct Index {
   
  private tabsController: TabsController = new TabsController();
  @State currentIndex: number = 0;


  @Builder TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {
   
    Column() {
   
      Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
        .size({
   width: 25, height: 25})
      Text(title)
        .fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')
    }
    .width('100%')
    .height(50)
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
   
      this.currentIndex = targetIndex;
      this.tabsController.changeIndex(this.currentIndex);
    })
  }
  build() {
   
    Column() {
   
      Tabs({
   barPosition: BarPosition.End, controller: this.tabsController}) {
   
        TabContent() {
   
          Home()
        }
        .tabBar(this.TabBuilder('List', 0, $r('app.media.home_selected'), $r('app.media.home_normal')))

        TabContent() {
   
          GridPage()
        }
        .tabBar(this.TabBuilder('List', 1, $r('app.media.mine_selected'), $r('app.media.mine_normal')))
      }
      .vertical(false)
      .barWidth("100%") // 设置TabBar宽度
      .barHeight(60) // 设置TabBar高度
      .width('100%')
      .height('100%')
      .backgroundColor(0xF5F5F5)
      .onChange((index: number) => {
   
        this.currentIndex = index;
      })
    }
    .width('100%')
    .height('100%')
  }
}

渲染后效果:
在这里插入图片描述
barPosition的值设置为BarPosition.End,使页签显示在底部。使用@Builder自定义TabBuilder函数,生成由Image和Text组成的页签。同时也给Tabs组件设置了TabsController控制器,当点击某个页签时,调用changeIndex方法进行页签内容切换。
最后在Tabs添加onChange事件。切换时,把当前最近Index赋给currentIndex保存起来。

参考

华为开发者联盟官网开发者基础课程

相关文章
|
2月前
|
Web App开发 前端开发 JavaScript
前端新利器:CSS容器查询——让组件真正“自适应
前端新利器:CSS容器查询——让组件真正“自适应
239 83
|
3月前
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
177 104
|
3月前
|
JavaScript 前端开发 API
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
本文介绍了HarmonyOS应用开发中的HML、CSS和JS语法。HML作为标记语言,支持数据绑定、事件处理、列表渲染等功能;CSS用于样式定义,涵盖尺寸单位、样式导入、选择器及伪类等特性;JS实现业务逻辑,包括ES6语法支持、对象属性、数据方法及事件处理。通过具体代码示例,详细解析了页面构建与交互的实现方式,为开发者提供全面的技术指导。
208 104
|
3月前
|
开发框架 编解码 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(一)
该文档详细介绍了一个兼容JS的类Web开发范式的方舟开发框架,涵盖概述、文件组织、js标签配置及app.js等内容。框架采用HML、CSS、JavaScript三段式开发方式,支持单向数据绑定,适合中小型应用开发。文件组织部分说明了目录结构、访问规则和媒体文件格式;js标签配置包括实例名称、页面路由和窗口样式信息;app.js则描述了应用生命周期与对象管理。整体内容旨在帮助开发者快速构建基于方舟框架的应用程序。
187 102
|
22天前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
57 1
|
2月前
|
存储 SQL 前端开发
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
本节以“账本”为例,使用关系型数据库接口实现账单的增、删、改、查操作。通过创建ArkTSRdb应用,演示如何操作RdbStore进行数据管理,并结合界面按钮实现交互功能。
98 0
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
|
2月前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
150 1
|
3月前
|
编译器 程序员 开发者
详解HarmonyOS NEXT系统中ArkTS和仓颉的混合开发
本文介绍了鸿蒙系统中ArkTs与仓颉语言的混合开发方法,讲解了如何通过DevEco Studio创建混合项目、目录结构特点及组件调用方式,强调编译器自动化处理大幅简化开发流程,提升了开发体验。
|
3月前
|
API 开发者 索引
HarmonyOS API 15 新晋导航点组件Indicator详解
本节介绍HarmonyOS API 15新增的导航点组件Indicator的特性和用法,支持圆点和数字两种导航样式。示例基于DevEco Studio 5.0.5,展示如何不依赖Swiper组件独立显示导航点。通过IndicatorComponentController控制翻页,设置初始索引、样式、循环、总数及方向等属性,并处理索引变化事件。代码示例详细解析各属性与事件的功能,适用于API Version 15及以上版本,支持ArkTS卡片和元服务使用。源码托管于《跟老卫学HarmonyOS开发》GitHub仓库。
55 1
|
3月前
|
开发者 容器
HarmonyOS Next快速入门:Button组件
本教程摘自《HarmonyOS Next快速入门》,聚焦HarmonyOS应用开发中的Button组件。Button支持胶囊、圆形和普通三种类型,可通过子组件实现复杂功能,如嵌入图片或文字。支持自定义样式(边框弧度、文本样式、背景色等)及点击事件处理。示例代码展示了不同类型按钮的创建与交互逻辑,助开发者快速上手。适合HarmonyOS初学者及对UI组件感兴趣的开发者学习。
192 0

热门文章

最新文章