ArkUI组件

目录

一、概述

声明式UI

应用模型

二、常用组件

1、Image:图片展示组件

示例

配置控制授权申请

2、Text:文本显示组件

示例 

3、TextInput:文本输入组件

示例

4、Button:按钮组件

5、Slider:滑动条组件

三、页面布局

1、线性布局组件

主轴对齐

交叉轴对齐

示例

四、循环控制与List

1、forEach

2、List

五、自定义组件

组件构建函数

通用样式封装


一、概述

        方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面开发。

ArkUI提供了非常多的组件供开发者使用,我们在使用时直接去查看官方文档即可。按钮(Button)-添加常用组件-添加组件-基于ArkTS的声明式开发范式-UI开发-开发-HarmonyOS应用开发

或者我们使用DevEco Studio的时候,将鼠标在一个API上悬停一段时间,就会出现show in Api Reference选项,此时点击就可以查看IDE自带的官方API文档,这个文档与官方文档是一摸一样的,非常好用。

声明式UI

我们接下来使用的是声明式开发范式,当然官方也推荐这种开发方式

那什么是声明式开发?

与声明式开发相对的就是命令式开发,我们先来看一段代码

        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 命令式编程方式:计算所有偶数的平方和
        int evenSquaredSumImperative = 0;
        for (int num : numbers) {
            if (num % 2 == 0) {
                evenSquaredSumImperative += num * num;
            }
        }
        System.out.println("Imperative: " + evenSquaredSumImperative);

在这段Python代码中,它的目的是计算所有偶数的平方和,最终打印输出。我们要实现这个功能就要思考怎么去实现,并最终使用代码逻辑去完成这个功能。

但是我们现在使用声明式开发

int evenSquaredSumDeclarative = numbers.stream()
                .filter(num -> num % 2 == 0)
                .mapToInt(num -> num * num)
                .sum();
        System.out.println("Declarative: " + evenSquaredSumDeclarative);

 我们直接调用了Java的流式API来进行实现,不用你去实现这个功能的底层逻辑,你只需要思考怎么去使用这些API来完成你需要的功能即可。

我们再来看我们以后使用的ArkUI开发代码

Text('hello')
  .fontSize(this.size)
Image('test.jpg')
  .width(this.count % 2 === 0 ? 100 : 200)    
  .height(this.offset + 100)

在这样的代码中,我们几乎看不到任何操作UI更新的代码,而这正是声明式UI的特点,它侧重于描述做什么,而不是怎么做,开发者只需要关注UI应该如何呈现,而不需要关心UI的具体实现过程。

开发者要做的,就只是提供不同UI与不同状态之间的映射关系,而无需编写如何在不同UI之间进行切换的代码。

应用模型

随着系统的演进发展,HarmonyOS先后提供了两种应用模型:

  • FA(Feature Ability)模型:HarmonyOS早期版本开始支持的模型,已经不再主推。

  • Stage模型:HarmonyOS 3.1 Developer Preview版本开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。 

Stage模型与FA模型最大的区别在于:Stage模型中,多个应用组件共享同一个ArkTS引擎实例;而FA模型中,每个应用组件独享一个ArkTS引擎实例。因此在Stage模型中,应用组件之间可以方便的共享对象和状态,同时减少复杂应用运行对内存的占用。Stage模型作为主推的应用模型,开发者通过它能够更加便利地开发出分布式场景下的复杂应用。

总之,我们以后的开发发使用也会基于Stage模型进行开发


二、常用组件

1、Image:图片展示组件

(1)、声明Image组件并设置图片源

Image(src: string | PixelMap | Resource)

  • string格式通常用来加载网络图片,因此需要申请网络访问权限:ohos.permission.INTERNET
Image('https://xxx.png')
  • PiexlMap格式可以加载像素图,常用在图片编辑中
Image(pixelMapObject)
  • Resource格式用来加载本地图片,用的最多

有两个目录可以用来存放本地图片,media文件夹和rawfile文件夹

//读取media文件夹下的图片,图片后缀可省略
Image($r{'app.media.mate60'})


//读取rawfile文件夹下的图片,图片后缀不可省略
Image($rawfile('mate60.png'))

(2)、添加图片属性

属性说明
width(100)宽度
height(120)高度
borderRadius(10)边框圆角
interpolation(ImageInterpolation.High)图片插值

图片插值使用用来消除图片锯齿的,就是能让一个模糊的图片变得平滑清晰

注意:如width()赋值可以是整型100,也可以是字符串'100%'

如果是数字整型100的话就是100vx(虚拟像素),如果是字符串'100%'就是按照图片本身占设备屏幕的比例

示例

你可能会疑问,不是说网络图片需要申请网络访问权限吗,为什么直接就出来了?
这是因为这个是预览图,并不算是真正运行的程序,我们需要启动虚拟机才算是启动程序,这时我们就需要配置授权了

配置控制授权申请

应用的APL(Ability Privilege Level)等级分为normal、system_basic和system_core三个等级,默认情况下,应用的APL等级都为normal等级。权限类型分为system_grant和user_grant两种类型。应用可申请的权限项参见应用权限列表。

需要在module.json5配置文件中声明一下权限即可

其中name是必须要填的,我们这里只使用name查看一下效果

此时启动了虚拟机网络图片也成功加载出来了。 

注意:忘记了组件的使用方法和API记得直接查看IDE自带的官方文档

2、Text:文本显示组件

(1)、声明Text组件并设置文本内容

Text(content?: string | Resource)

  • string格式,直接填写文本内容
Text('图片宽度')
  • Resource格式,读取本地资源文件
Text($r('app.string.width_label'))

解释一下这个是什么意思

同样的$r 符号读取本地文件,app是默认前缀。

我们的resources目录下存放着我们的本地资源,在element目录下有一个叫string的json格式文件,里面存放着一些字符常量。

因此这行代码的意思就是寻找本地资源目录下string.json文件中的名为width_label的json对象

这里有一个点需要注意的是,我们在base外面能看到两个目录,en_US和zh_CN,里面也有element文件夹

这是为了国际化,系统会检测你的使用语言版本来使用不同限定词目录下的element,en_US就是英文系统,zh_CH就是中文系统

但是需要注意的一点是,它们里面存在的属性,在base目录下也要存在才能使用,否则会报错。因为程序会先去base里面找,然后再去限定词目录里面更换值,如果没有该限定词目录,才会使用base里面的默认值。

(2)、添加文本属性

属性说明
lineHeight(32)行高
fontSize(20)字体大小
fontColor('#36D')字体颜色
fontWeight(FontWeight.Medium)字体粗细

示例 

做一个国际化双语言的文本展示

base

    {
      "name": "wal",
      "value": "An1ong"
    }

 zh_CN

    {
      "name": "wal",
      "value": "优米"
    }

en_US

    {
      "name": "wal",
      "value": "yummy"
    }

代码

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        Text($r("app.string.wal"))
          .fontColor('#36D')
          .fontSize(38)
      }
    }
  }
}

效果

3、TextInput:文本输入组件

(1)、声明TextInput组件

TextInput({ placeholder?: ResourceStr,text?:ResourceStr})

  • placeholder:输入文本
TextInput({placeholder: '请输入无输入时的提示文本'})
  • text:输入框当前的默认文本内容
TextInput({text: '默认文本'})

(2)、添加属性和事件

属性作用
width(150)
height(30)
backgroundColor('#FFF')背景色
type(InputType.Password)输入框类型

onChange( value => {

        //value是文本框的内容

})

当输入框中的内容发生改变时执行事件

这里type输入框类型有好多,有现成的Email格式、Phone格式、Password格式等会对输入的内容进行约束,这样就不用自己写正则表达式来检验了。

示例

@Entry
@Component
struct Index {
  @State imgSize: number = 100

  build() {
    Row() {
      Column() {
        Image($r('app.media.icon'))
          .width(this.imgSize)
          .interpolation(ImageInterpolation.High)

        Text('此时图标的大小为: ' + this.imgSize)
          .fontSize(30)

        TextInput({placeholder: '请输入图片的大小'})
          .type(InputType.Number)
          .width(250)
          .height(50)
          .onChange(value => {
            this.imgSize = parseInt(value)
          })

      }
    }
  }
}

4、Button:按钮组件

(1)、声明Button组件,label是按钮文字

Button(lable?:ResourceStr )

  • 文字型按钮
Button("点我")
  • 自定义按钮,在Button中嵌套其他组件
Button(){
    Image($r('app.media.search')).width(20).margin(10)
}

(2)、添加属性和响应

属性说明
width(100)
height(30)
type(ButtonType.Normal)按钮类型

onClick(()=> {

        //处理点击事件

})

点击事件

type属性有三种类型

Capsule胶囊型按钮(圆角默认为高度的一半)
Circle圆形按钮
Normal普通按钮(默认不带圆角)

5、Slider:滑动条组件

(1)、声明一个滑动条组件

Slider(options?:SliderOptions)

参数作用
min(0)最小值
max(100)最大值
value(30)当前值
step(10)滑动步长,默认是1
style:SliderStyle.OutSet

InSet就是滑块在滑动条里

direction:Axis.Horizontal水平滑动,Vertical是垂直滑动
reverse:false是否反向滑动,就是大小互换一下

(2)、添加属性和响应 

属性作用
width('90%')大小
trackThickness(7)滑动条粗细
blockColor()滑块的颜色
trackColor()滑轨的颜色
showTips(true)是否展示value百分比提示

onChange(value => {

        //value就是当前值

})

滑动触发事件


三、页面布局

1、线性布局组件

我们之前的例子中用了很多次Row()与Column(),它们就是线性布局组件

Column()是列容器,Row()是行容器

仅仅这样使用是不够的,我们在组装一个页面的时候为了美观都会让各个组件对齐或是居中等等

属性作用参数
justifyContent设置子元素在主轴方向的对齐格式FlexAlign枚举
alignItems设置子元素在交叉轴方向的对齐格式

Row容器使用VerrticalAlign枚举

Column容器使用HorizontalAlign枚举

  

FlexAlign的对齐方式也有很多

主轴对齐

Column容器

Row容器

交叉轴对齐

Column容器

Row容器

 

这里有一个点需要注意,因为布局容器的大小是默认自适应组件的大小的,所以如果你不修改width和height属性就直接使用布局对齐的话是没有效果的,比如这里我这里明明使用了布局对齐,但是按钮的格式并没有改变

我们添加一个背景色看看是咋回事

可以看到Row的大小默认就是这两个按钮所占的大小,所以首先要调整一下Row容器的大小

示例

现在我们来综合以上学过的组件和布局来写一个案例

@Entry
@Component
struct Index {
  @State imgSize: number = 100

  build() {
    Column() {
      Row(){
        Image($r("app.media.app_icon"))
          .width(this.imgSize)
      }
      .height(350)

      Row(){
        Text($r("app.string.image_width"))
          .fontSize(25)
          .fontWeight(FontWeight.Bold)

        TextInput({text: this.imgSize.toFixed(0)})
          .width(200)
          .type(InputType.Number)
          .onChange(value => {
            this.imgSize = parseInt(value)
          })
      }
      .width('100%')
      .padding({left: 20,right: 20})

      Divider()
      .width("91%")

      Row(){
        Button("缩小")
          .type(ButtonType.Capsule)
          .onClick(() => {
            if (this.imgSize > 0) {
              this.imgSize -= 10
            }
          })
        Button("扩大")
          .type(ButtonType.Normal)
          .onClick(() => {
            if(this.imgSize < 300){
              this.imgSize += 10
            }
          })
      }
      .width("100%")
      .justifyContent(FlexAlign.SpaceEvenly)
      .margin({top: 35,bottom:35})

      Row(){
        Slider({min: 0,max: 300, style: SliderStyle.InSet,step: 10,value: this.imgSize})
          .width("90%")
          .showTips(true)
          .trackThickness(20)
          .onChange(value => {
            this.imgSize = value
          })
      }

    }
    .width("100%")
    .height("100%")

  }
}


四、循环控制与List

1、forEach

比如我们要写一个商品列表,但是有100条商品要展示,每一个里面都要写布局和重复的组件。一个一个手动写的话未免也太麻烦了,于是我们可以直接使用forEach函数来循环生成

一般键生成函数不需要我们重写,都用默认的就行 

2、List

刚才使用forEach的时候循环打印了所有的数据,你会一个Column容器根本装不下所有的数据。因此为了实现滚动查看多条信息的功能,我们使用List容器

  • ListItem(列表项)数量过多超出屏幕后,会自动提供滚动功能
  • 它既可纵向排列,也可横向排列

没错,他就是来替代Column容器的。

不过要注意Listitem不是容器,List才是,所以ListItem中只能写一个根组件,如果要使用多个组件的话要用别的容器将它们包裹起来


五、自定义组件

就像函数一样,我们将组件封装起来,这样就可以复用了

我们的index.ets组件上有一个@Entry注解,这代表它是一个入口组件,一开始就会展示这个组件。

其实将它去掉就是一个自定义组件了

当然我们不会像这样一样将所有的Component写在一个文件里,我们会分开为个个文件来使用

记得export导出

 引入

 

组件构建函数

当然,也可以直接将这些组件封装成一个函数来使用

通用样式封装

这两个都是写在@Component外面的,如果要写在里面就把function关键字去掉就行了

如果是只是Text或是别的组件生效的话,就这样写,不过这样的就不能写在@Component里面了,只能写在外面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Navicat 技术指引 | 适用于 GaussDB 分布式的数据查看器

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

【Git 小妙招】一文快速上手 Git 基本操作(两万字图文讲解)

文章目录 前言1. 创建 Git 本地仓库2. 配置 Git3. 认识工作区, 暂存区, 版本库3.1 添加文件(场景一)3.2 查看 .git 文件3.3 添加文件(场景二) 4. 修改文件5. 版本回退6. 撤销修改6.1 对于工作区的代码&#xff0c;还没有 add(场景一)6.2 已经 add &#xff0c;但没有 commit(场…

苹果电脑Python编辑开发软件pycharm pro 2023功能介绍

PyCharm Pro 2023是由JetBrains开发的一款专为Python开发者设计的跨平台集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和直观的用户界面&#xff0c;旨在提高在Mac平台上进行Python编程的效率。 PyCharm Pro 2023是PyCharm系列中的专业版&#xff0c;具有更多高…

D3846关键参数计算及设置方法D3846在电焊机产品中的作用是什么?

D3846是一块电流模式的PWM控制电路。 主要特点&#xff1a; ● 自动前馈补偿 ● 可编程控制的逐个脉冲限流功能 ● 推挽输出结构^ 下自动对称校正 ● 负载响应特性好 ● 可并联运行&#xff0c;适用于模块系统 ● 内置差动电流检测放大器&#xff0c; 共模输入范围宽 ● 双脉…

Linux高级管理--安装MySQL数据库系统

MySQL服务基础 MySQL.是一个真正的多线程、多用户的SQL数据库服务&#xff0c;凭借其高性能、高可靠和易于使 用的特性&#xff0c;成为服务器领域中最受欢迎的开源数据库系统。在2008年以前&#xff0c;MySOL项目由MySQL AB公司进行开发&#xff0c;发布和支持&#xff0c;之后…

查看mysql服务器的版本

在cmd下&#xff0c;可以使用命令mysql -V或者mysql --version查看mysql服务器的版本。例如&#xff1a; 如果已经登录mysql&#xff0c;可以使用命令show variables like version;来查询mysql服务器的版本。例如&#xff1a;

OpenAI Q* (Q Star)简单介绍

一、Q Star 名称由来 Q* 的两个可能来源如下&#xff1a; 1&#xff09;Q 可能是指 "Q-learning"&#xff0c;这是一种用于强化学习的机器学习算法。 Q 名称的由来*&#xff1a;把 "Q*"想象成超级智能机器人的昵称。 Q 的意思是这个机器人非常善于做决定…

串行计时芯片D1380/D1381,2.0V~5.5V 工作电流: 2V时 与TTL 兼容,采用DIP8、SOP8封装

D1380/D1381是一个带秒、分、时、日、日期、月、年的串行时钟保持芯片,每个月多少天以及闰年能自动调节, D1380/D1381低功耗工作方式, D1380/D1381用若干寄存器存储对应信息&#xff0c;一个32.768kHz 的晶振校准时钟&#xff0c;为了使用最小弓|脚&#xff0c;D1380/D1381使用…

PCIe在狂飙,SAS存储之路还有多远?

随着科技的飞速发展&#xff0c;固态硬盘&#xff08;SSD&#xff09;已经成为现代计算机系统中不可或缺的一部分。它以其出色的性能和可靠性&#xff0c;改变了我们对于存储设备的期待。当前业内SSD广泛应用&#xff0c;接口协议也有多样性&#xff0c;常见的SSD的接口协议归纳…

2024年风口最热门的项目,区块链技术重塑多个行业

区块链技术是一种基于去中心化、分布式、不可篡改的数据存储和传输技术&#xff0c;以链式数据结构为基础&#xff0c;通过密码学算法保证数据的安全性和不可篡改性。 以下是区块链技术的一些核心特点&#xff1a; 去中心化&#xff1a;区块链技术采用分布式架构&#xff0c;没…

5 转向事件驱动的架构

文章目录 核心概念消息代理事件和消息了解事件异步消息通信响应式系统 事件驱动的利弊消息传递模式发布—订阅工作队列过滤器数据持久性 消息传递代理协议、标准和工具AMQP和RabbitMQ基本概念交换类型和路由消息确认和拒绝 设置RabbitMQ安装RabbitMQRabbitMQ管理界面 Spring AM…

基于ssm大学生创新创业平台项目管理子系统设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对大学生创新创业项目信息管理混乱&#xff0c;出错率高&#xff0c;信…

后台业务管理系统原型模板,Axure后台组件库(整套后台管理页面)

后台业务系统需要产品经理超强的逻辑思维能力和业务理解能力&#xff0c;整理了一批后台原型组件及完整的用 Axure 8 制作的后台系统页面&#xff0c;方便产品经理们快速上手制作后台原型。 包括交互元件、首页、商品、订单、库存、用户、促销、运营、内容、统计、财务、设置、…

跨品牌的手机要怎样相互投屏?iPhone和iPad怎么相互投屏?

选择买不同品牌的手机是基于品牌声誉、产品特点、价格和性价比等多个因素的综合考虑。每个人的需求和偏好不同&#xff0c;选择适合自己的手机品牌是一个个人化的决策。 一些品牌可能更加注重摄影功能&#xff0c;而其他品牌可能更加注重性能和速度。选择不同品牌的手机可以根据…

Transformer预测销售量

&#x1f916; 专栏《人工智能》 &#x1f4d6; 博客说明&#xff1a; 本专栏记录我个人学习和实践人工智能相关算法的心得与内容&#xff0c;一同探索人工智能的奇妙世界吧&#xff01; &#x1f680; 零、说明 心血来潮&#xff0c;想利用Transformer做一个销售量预测的内容…

k8s集群部分使用gpu资源的pod出现UnexpectedAdmissionError问题

记录一次排查UnexpectedAdmissionError问题的过程 1. 问题 环境 3master节点N个GPU节点 kubelet版本&#xff1a;v1.19.4 kubernetes版本&#xff1a;v1.19.4 生产环境K8S集群&#xff0c;莫名其妙的出现大量UnexpectedAdmissionError状态的Pod&#xff0c;导致部分任务执…

C# | CountdownEvent使用教程 (通过与ManualResetEvent对比,快速了解其特性)

C# CountdownEvent使用教程 对于熟悉ManualResetEvent的同学来说&#xff0c;了解CountdownEvent的差异对于更好地利用它们是非常重要的。通过对ManualResetEvent和CountdownEvent的对比&#xff0c;我们可以更好地理解CountdownEvent的特点和使用场景。 ManualResetEvent回顾…

SpringCloud微服务 【实用篇】| Docker启示录

目录 一&#xff1a;Docker启示录 1. Docker启示录 2. Docker和虚拟机的区别 3. Docker架构 4. Centos7安装Docker 4.1. 卸载 4.2. 安装docker 4.3. 启动docker 4.4. 配置镜像加速 前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽…

阿里云国际版如何为SSL证书更换域名?

如果您需要为已签发的SSL证书更换绑定的域名&#xff0c;您可以使用数字证书管理服务提供的更换域名功能。本文介绍如何为SSL证书更换域名。 操作步骤 为SSL证书变更域名&#xff0c;您相当于重新购买了一张新证书&#xff0c;需要支付一定的费用。 您在更换域名前&#xff…

快速解决Edge浏览器常见问题:完整教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、Edge浏览器是什么&#xff1f; 二、常见的问题 1. DNS服务器出错 解决方案一&#xff1a;清除浏览器缓存和Cookie 2.网络问题 3.缓存和Cook…