鸿蒙应用开发ArkTS基础组件的使用

news2024/11/30 11:41:09

语雀知识库地址:语雀HarmonyOS知识库
飞书知识库地址:飞书HarmonyOS知识库


本文示例代码地址:Gitee 仓库地址

嗨,各位好呀,我是小白

上一篇文章我为大家介绍了如何使用 ArkTS 开发鸿蒙应用,对 HarmonyOS 项目代码结构做了初步的介绍
还没看过的小伙伴可以先复习一下,对接下来的内容会有很大的帮助

浅析HarmonyOS开发语言ArkTS

从上面的案例中,很容易就能看出,开发一个鸿蒙应用实际上就是使用 ArkTS 提供的各个组件来组合成一个页面
那么,要熟练的使用 ArkTS 提供的组件就显得尤为重要
这篇文章就向大家介绍一些 ArkTS 常用的基础组件

Image——图片组件

Image 为图片组件,常用于在应用中显示图片

Image 支持加载 PixelMap、ResourceStr 和 DrawableDescriptor 类型的数据源,支持 png、jpg、bmp、svg 和 gif 类型的图片格式

定义方式
Image(src: string | Resource | media.PixelMap)

其入参需要传入一个图片源,参数名为 src ,参数类型是 union 联合类型,支持字符串地址、像素图以及本地图片

参数使用
  1. string:该方式通常用来加载网络图片,也可以加载本地资源,比如下面这种写法
// 加载网络资源
Image('https://developer.huawei.com/images/logo-developer-header.svg')
// 加载本地资源 创建文件夹,将本地图片放入ets文件夹下的任意位置,Image组件引入本地图片路径,即可显示图片(根目录为ets文件夹)
Image('images/view.jpg')

效果如下

image.png

在这里需要注意的是,当使用该方式获取网络上的图片资源时,在本地预览是可以进行展示的,但是当使用模拟器进行调试时,使用该方式获取的网络资源是无法展示的,这是因为该方式需要使用网络权限,所以我们可以在当前模块的 module.json5 配置文件的 module 标签下加入以下代码即可

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET"
  }
]
  1. PixelMap:这种方式可以用来加载像素图,常用于图片编辑的场景
  2. Resource:加载本地图片,使用资源格式可以跨包/跨模块引入图片,resources文件夹下的图片都可以通过 $r 资源接口读取到并转换到 Resource 格式,推荐使用
Image($r('app.media.icon'))
Image($rawfile('icon.png'))

可以看到,使用 Resource 类型加载图片时,有两种写法,这两种写法所读取的文件目录是不同的

  • 使用 $r() 方式所读取的目录是 src/main/resources/base/media 该目录下的文件,这种方式不需要写文件的后缀名
  • 使用 $rawfile() 方式读取的目录是 src/main/resources/rawfile 该目录下的文件,这种方式必须将文件的后缀名写上,否则就会报错 (如果没有这个文件夹,手动创建即可)
  1. 媒体库文件:即手机内部文件,支持file://路径前缀的字符串,用于访问通过媒体库提供的图片路径
  2. base64:路径格式为 data:image/[png | jpeg | bmp | webp]; base64,[base64 data],其中 [base64 data] 为 Base64 字符串数据。Base64 格式字符串可用于存储图片的像素数据,在网页上使用较为广泛

效果如下
image.png

设置属性

Image 作为基本组件,除了有通用属性 width()、height()、padding() 等,还有其自身所拥有的属性

Image($r('app.media.car'))
  .alt($r('app.media.icon'))
  .width('50%')
  .height(70)
  .borderRadius(10)
  .interpolation(ImageInterpolation.High)

其中

  • alt 为图片加载时显示的占位图,支持本地图片(png、jpg、bmp、svg 和 gif 类型),不支持网络图片
  • borderRadius 为图片设置圆角,数值越大,图片的圆角就越大
  • interpolation 设置图片的插值效果,即减轻低清晰度图片在放大显示时出现的锯齿问题,可以为数值,也可以使用枚举值

image.png

设置事件

onComplete:图片数据加载成功和解码成功时均触发该回调,返回成功加载的图片尺寸

onComplete(callback: (event?: { width: number, height: number, componentWidth: number, componentHeight: number, loadingStatus: number }) => void)
  • loadingStatus 参数用于返回图片加载成功的状态值。返回的状态值为0时,表示图片数据加载成功。返回的状态值为1时,表示图片解码成功

onError:图片加载异常时触发该回调

onError(callback: (event?: { componentWidth: number, componentHeight: number , message: string }) => void)

onFinish:当加载的源文件为带动效的 svg 格式图片时,svg 动效播放完成时会触发这个回调。如果动效为无限循环动效,则不会触发这个回调。仅支持svg格式的图片

onFinish(event: () => void)

Text/Span——文本组件

定义方式
Text(content?: string | Resource)
Span(value: string | Resource)

在 Text 中套用 Span 组件时,Span 的内容会覆盖掉 Text 的内容

参数使用
  • string:传入的内容即为所显示的内容
Text('Hello World')

image.png

  • Resource:该方式传入的内容为当前系统语言所对应文件中的数据值
Text($r('app.string.module_desc'))

image.png

这里需要注意的是,$r 方式默认是根据系统的语言来匹配读取对应语言文件夹下 /element/string.json 文件中对应的值,如果都匹配不到的话,则读取的是 /resources/base/element/string.json,因此,在使用此方式读取值的时候,需要在每种系统语言对应的目录文件中都添加相同 key 的数据,否则会报错

image.png

设置属性

Text 除了通用的属性外,其自身也有许多属性可以设置

示例 1
// 单行文本
Text('textAlign')
  .fontSize(15)
  .fontColor('#36D')
  .fontWeight(FontWeight.Bold)
  .padding({top:5, bottom:5})
Text('TextAlign set to Center.')
  .textAlign(TextAlign.Center)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
Text('TextAlign set to Start.')
  .textAlign(TextAlign.Start)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
Text('TextAlign set to End.')
  .textAlign(TextAlign.End)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')

// 多行文本
Text('This is the text content with textAlign set to Center.')
  .textAlign(TextAlign.Center)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
Text('This is the text content with textAlign set to Start.')
  .textAlign(TextAlign.Start)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
Text('This is the text content with textAlign set to End.')
  .textAlign(TextAlign.End)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')


// 文本超长时显示方式
Text('TextOverflow+maxLines')
  .fontSize(15)
  .fontColor('#36D')
  .fontWeight(FontWeight.Bold)
  .padding({top:5, bottom:5})
// 超出maxLines截断内容展示
Text('This is the setting of textOverflow to Clip text content This is the setting of textOverflow to None text content. This is the setting of textOverflow to Clip text content This is the setting of textOverflow to None text content.')
  .textOverflow({ overflow: TextOverflow.Clip })
  .maxLines(1)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)

// 超出maxLines展示省略号
Text('This is set textOverflow to Ellipsis text content This is set textOverflow to Ellipsis text content.'.split('')
  .join('\u200B'))
  .textOverflow({ overflow: TextOverflow.Ellipsis })
  .maxLines(1)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)

Text('lineHeight')
  .fontSize(15)
  .fontColor('#36D')
  .fontWeight(FontWeight.Bold)
  .padding({top:5, bottom:5})
Text('This is the text with the line height set. This is the text with the line height set.')
  .fontSize(12).border({ width: 1 }).padding(10)
Text('This is the text with the line height set. This is the text with the line height set.')
  .fontSize(12).border({ width: 1 }).padding(10)
  .lineHeight(20)

效果如下:

image.png
其中:

  • textAlign:设置文本段落在水平方向的对齐方式,默认值:TextAlign.Start,可选值:TextAlign.Start、TextAlign.Center、TextAlign.End
  • textOverflow:设置文本超长时的显示方式。默认值:{overflow: TextOverflow.Clip}
  • lineHeight:设置文本的文本行高,设置值不大于 0 时,不限制文本行高,自适应字体大小,Length 为 number 类型时单位为fp
示例 2
  Text('decoration')
    .fontSize(15)
    .fontColor('#36D')
    .fontWeight(FontWeight.Bold)
    .padding({top:5, bottom:5})
  Text('This is the text content with the decoration set to LineThrough and the color set to Red.')
    .decoration({
      type: TextDecorationType.LineThrough,
      color: Color.Red
    })
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')


  Text('This is the text content with the decoration set to Overline and the color set to Red.')
    .decoration({
      type: TextDecorationType.Overline,
      color: Color.Red
    })
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')


  Text('This is the text content with the decoration set to Underline and the color set to Red.')
    .decoration({
      type: TextDecorationType.Underline,
      color: Color.Red
    })
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')

  // 文本基线偏移
  Text('baselineOffset')
    .fontSize(15)
    .fontColor('#36D')
    .fontWeight(FontWeight.Bold)
    .padding({top:5, bottom:5})
  Text('This is the text content with baselineOffset 0.')
    .baselineOffset(0)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')
  Text('This is the text content with baselineOffset 30.')
    .baselineOffset(30)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')
  Text('This is the text content with baselineOffset -20.')
    .baselineOffset(-20)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')

  // 文本字符间距
  Text('letterSpacing')
    .fontSize(15)
    .fontColor('#36D')
    .fontWeight(FontWeight.Bold)
    .padding({top:5, bottom:5})
  Text('This is the text content with letterSpacing 0.')
    .letterSpacing(0)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')
  Text('This is the text content with letterSpacing 3.')
    .letterSpacing(3)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')
  Text('This is the text content with letterSpacing -1.')
    .letterSpacing(-1)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')

  Text('textCase')
    .fontSize(15)
    .fontColor('#36D')
    .fontWeight(FontWeight.Bold)
    .padding({top:5, bottom:5})
  Text('This is the text content with textCase set to Normal.')
    .textCase(TextCase.Normal)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')
  // 文本全小写展示
  Text('This is the text content with textCase set to LowerCase.')
    .textCase(TextCase.LowerCase)
    .fontSize(12)
    .border({ width: 1 })
    .padding(10)
    .width('100%')
  // 文本全大写展示
  Text('This is the text content with textCase set to UpperCase.')
    .textCase(TextCase.UpperCase)
    .fontSize(12).border({ width: 1 }).padding(10)

效果如下

image.png
其中:

  • decoration:设置文本装饰线样式及其颜色。默认值:{type: TextDecorationType.None,color:Color.Black}
  • baselineOffset:设置文本基线的偏移量,默认值0。设置该值为百分比时,按默认值显示
  • letterSpacing:设置文本字符间距。默认值0。设置该值为百分比时,按默认值显示
  • textCase:设置文本大小写。默认值:TextCase.Normal

TextInput/TextArea——文本输入

定义方式
TextArea(value?:{placeholder?: ResourceStr, text?: ResourceStr, controller?: TextAreaController})
TextInput(value?:{placeholder?: ResourceStr, text?: ResourceStr, controller?: TextInputController})
参数使用
  • placeholder:
TextInput({placeholder:'placeholder 占位语'})
TextArea({placeholder:'placeholder占位语placeholder占位语placeholder占位语'})

image.png

  • text:
TextInput({text:'为TextInput设置默认值'})
TextArea({text:'我是TextArea我是TextArea我是TextArea我是TextArea'})

image.png
当 placeholder 与 text 同时存在时,placeholder 的值将会被 text 的内容所覆盖

设置属性
TextInput({ text: this.text, placeholder: 'input your word...', controller: this.controller })
  .placeholderColor(Color.Grey)
  .placeholderFont({ size: 14, weight: 400 })
  .caretColor(Color.Blue)
  .width(400)
  .height(40)
  .margin(20)
  .fontSize(14)
  .fontColor(Color.Black)
  .inputFilter('[a-z]', (e) => {
    console.log(JSON.stringify(e))
  })
  .onChange((value: string) => {
    this.text = value
  })
Text(this.text)
Button('Set caretPosition 1')
  .margin(15)
  .onClick(() => {
    // 将光标移动至第一个字符后
    this.controller.caretPosition(1)
  })
// 密码输入框
TextInput({ placeholder: 'input your password...' })
  .width(400)
  .height(40)
  .margin(20)
  .type(InputType.Password)
  .maxLength(9)
  .showPasswordIcon(true)
// 内联风格输入框
TextInput({ placeholder: 'inline style' })
  .width(400)
  .height(50)
  .margin(20)
  .borderRadius(0)
  .style(TextInputStyle.Inline)
	.copyOption(CopyOptions.LocalDevice)
  .textAlign(TextAlign.Start)

image.png
其中:

  • placeholderColor:设置placeholder文本颜色
  • placeholderFont:设置placeholder文本样式
  • caretColor:设置输入框光标颜色
  • inputFilter:正则表达式,匹配表达式的输入允许显示,不匹配的输入将被过滤。目前仅支持单个字符匹配,不支持字符串匹配。其中 value 设置正则表达式,error 设置正则匹配失败时,返回被过滤的内容
  • type:输入框的类型,默认是 InputType.Normal
  • maxLength:设置文本的最大输入字符数
  • showPasswordIcon:当 type 属性为 InputType.Password 时,输入框末尾的图标是否显示
  • style:设置输入框为默认风格或内联输入风格
  • copyOption:设置输入的文本是否可复制
  • textAlign:设置输入文本在输入框中的对齐方式
设置事件
  • onChange(callback: (value: string) => void):输入内容发生变化时的回调函数
  • onSubmit(callback: (enterKey: EnterKeyType) => void):按下输入法回车键触发该回调,返回值为当前输入法回车键的类型
  • onCopy(callback:(value: string) => void):长按输入框内部区域弹出剪贴板后,点击剪切板复制按钮,触发该回调

Button——按钮

定义方式
Button(options?: {type?: ButtonType, stateEffect?: boolean})
Button(label?: string, options?: { type?: ButtonType, stateEffect?: boolean })
参数使用
  • label:按钮文本内容
Button('按钮文本内容 label')

image.png

Button('这是一个按钮-正常', { type: ButtonType.Normal, stateEffect: true })
Button('这是一个按钮-胶囊', { type: ButtonType.Capsule, stateEffect: true })
Button('Ok-圆', { type: ButtonType.Circle, stateEffect: true })
  • options-type:描述按钮显示样式
  • options-stateEffect:按钮按下时是否开启按压态显示效果,当设置为 false 时,按压效果关闭。当开启按压态显示效果,设置状态样式时,会基于状态样式设置完成后的背景色再进行颜色叠加

image.png

设置属性

Button 组件的属性在通用属性中均已支持

设置事件

Button 组件的事件在通用事件中均已支持

结语

除了以上所列举的 Image、Text/Span、TextInput/TextArea、Button 组件外,ArkTS 还支持了 Menu(菜单)、Slider(滑块)、Radio(单选)、CheckBox(复选框)、Progress(进度条) 等我们在手机上所能看到的组件,这些组件的使用方式大同小异,无需特殊记忆,在需要使用时查阅官方文档即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IDEA】解决mac版IDEA,进行单元测试时控制台不能输入问题

我的IDEA版本 编辑VM配置 //增加如下配置,重启IDEA -Deditable.java.test.consoletrue测试效果

2023最新最全【Wireshark 】 安装教程(附安装包)

简介 wireshark是非常流行的网络封包分析工具,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。 为了安全考虑,wireshark只能查看封包,而…

【React Hooks】useReducer()

useReducer 的三个参数是可选的,默认就是initialState,如果在调用的时候传递第三个参数那么他就会改变为你传递的参数,实际开发不建议这样写。会增加代码的不可读性。 使用方法: 必须将 useReducer 的第一个参数(函数…

代码随想录算法训练营第四十天|139.单词拆分,多重背包,背包问题

139. 单词拆分 - 力扣(LeetCode) 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1&a…

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址:GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…

【Hive】启动beeline连接hive

1、解决报错2、在datagrip上连接hive 1、解决报错 刚开始一直报错&#xff1a;启动不起来 hive-site.xml需要配置hiveserver2相关的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bin…

力扣思维题/经典面试题——下一个排序

https://leetcode.cn/problems/next-permutation/description/ 字节面试题&#xff0c;非常经典的逻辑思维题 1、找到第一个下降点&#xff0c;说明这个点可以变得稍微大一点以至于让整个排列变得更加大 为什么&#xff0c;仔细想想&#xff0c;后面都是倒序了怎么都不可能变得…

fijkplayer flutter 直播流播放

fijkplayer flutter 直播流播放 fijkplayer 是 ijkplayer 的 Flutter 封装&#xff0c; 是一款支持 android 和 iOS 的 Flutter 媒体播放器插件&#xff0c; 由 ijkplayer 底层驱动。 通过纹理&#xff08;Texture&#xff09;接入播放器视频渲染到 Flutter 中。 前言 目前使用…

class072 最长递增子序列问题与扩展【算法】

class072 最长递增子序列问题与扩展【算法】 code1 300. 最长递增子序列 // 最长递增子序列和最长不下降子序列 // 给定一个整数数组nums // 找到其中最长严格递增子序列长度、最长不下降子序列长度 // 测试链接 : https://leetcode.cn/problems/longest-increasing-subsequen…

Java 简易版 UDP 多人聊天室

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

分集水器在中央空调系统中的应用,工作原理压力选型参数尺寸

​ 1&#xff1a;中央空调分集水器设备介绍 分集水器是由分水器和集水器组合而成的水流量分配和会集装置。分水器是将一路进水通过一个容器分为几路输出的设备&#xff0c;而集水器则是将多路进水通过一个容器一路输出的设备。其管理若干的支路管道&#xff0c;分别包括回水支路…

1-1、Java概述

语雀原文链接 文章目录 1、Java发展2、Java体系结构3、Java特点 1、Java发展 1990年&#xff0c;Sun公司(Stanford University Network,斯坦福大学网络公司)詹姆斯高斯林推出的一门语言最开始注册的名字oak语言(橡树)&#xff0c;重名了被迫改成Java2009年Sun公司被甲骨文Ora…

IP地址定位技术为网络安全建设提供全新方案

随着互联网的普及和数字化进程的加速&#xff0c;网络安全问题日益引人关注。网络攻击、数据泄露、欺诈行为等安全威胁层出不穷&#xff0c;对个人隐私、企业机密和社会稳定构成严重威胁。在这样的背景下&#xff0c;IP地址定位技术应运而生&#xff0c;为网络安全建设提供了一…

向日葵远程控制鼠标异常的问题

​ 在通过向日葵进行远程控制的时候&#xff0c;可能会遇到鼠标位置异常的问题。此时&#xff0c;不管怎么移动鼠标&#xff0c;都会停留在屏幕最上方&#xff0c;而无法点击到正确的位置。如图&#xff1a; 此时&#xff0c;如果启用了“被控端鼠标”功能&#xff0c;可以正…

代码随想录二刷 |二叉树 |二叉树的最大深度

代码随想录二刷 &#xff5c;二叉树 &#xff5c;二叉树的最大深度 题目描述解题思路代码实现 题目描述 104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a;…

键盘打字盲打练习系列之矫正坐姿——4

一.欢迎来到我的酒馆 盲打&#xff0c;矫正坐姿&#xff01; 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿1.键盘鼠标选购指南2.椅子选购指南 三.改善坐姿建议 二.继续练习 前面的章节&#xff0c;我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&am…

table中cellspacing、cellpadding的css替代写法

table中cellspacing、cellpadding的css替代写法 table{border:0;margin:0;border-collapse:collapse;border-spacing:0;} /*控制cellspacing*/ table td{padding:0;} /*控制cellpadding*/

用chatGPT开发项目:我想的无人的智慧树网站 流量之神 利用人工智能的算法将人吸引住 GPT4是不是越来越难用了,问一下就要证明一下自己是不是人类

广度发散&#xff1a;让AI给出时代或今日或你关注的热点事件 比如采集新闻头条&#xff0c;根据内容或标题&#xff0c;以不同的角度&#xff0c;或各种人群的角色&#xff0c;生成50篇简短的文章。一下就能占传统的搜索引擎。这是AI最擅长的【千人千面&#xff0c;海量生成】…

C语言中实参和形参的值传递,一直都不理解

C语言中实参和形参的值传递&#xff0c;一直都不理解 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01…

Unity 实现单例模式

目录 基本概念 饿汉模式(推荐) 懒汉模式&#xff1a; 基本概念 单例模式&#xff1a;类只有一个实例&#xff0c;一般使用static来实现单例模式&#xff1b; 比如&#xff1a;有一个Test类,实现了单例&#xff0c;假设这个唯一的实例名为SingTonle,实例在类内被实现并被stat…