鸿蒙开发之ArkUI组件常用组件图片和文本

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

开发文档地址  : 文档中心

基本概念

  • UI:即用户界面。开发者可以将应用的用户界面设计为多个功能页面,每个页面进行单独的文件管理,并通过页面路由API完成页面间的调度管理如跳转、回退等操作,以实现应用内的功能解耦。 
  • 组件:UI构建与显示的最小单位,如列表、网格、按钮、单选框、进度条、文本等。开发者通过多种组件的组合,构建出满足自身应用诉求的完整界面。

两种开发范式

针对不同的应用场景及技术背景,方舟开发框架提供了两种开发范式,分别是基于ArkTS的声明式开发范式(简称“声明式开发范式”)和兼容JS的类Web开发范式(简称“类Web开发范式”)。

  • 声明式开发范式:采用基于TypeScript声明式UI语法扩展而来的ArkTS语言,从组件、动画和状态管理三个维度提供UI绘制能力。 
  • 类Web开发范式:采用经典的HML、CSS、JavaScript三段式开发方式,即使用HML标签文件搭建布局、使用CSS文件描述样式、使用JavaScript文件处理逻辑。该范式更符合于Web前端开发者的使用习惯,便于快速将已有的Web应用改造成方舟开发框架应用。 

在开发一款新应用时,推荐采用声明式开发范式来构建UI,主要基于以下几点考虑:

  • 开发效率:声明式开发范式更接近自然语义的编程方式,开发者可以直观地描述UI,无需关心如何实现UI绘制和渲染,开发高效简洁。 
  • 应用性能:如下图所示,两种开发范式的UI后端引擎和语言运行时是共用的,但是相比类Web开发范式,声明式开发范式无需JS框架进行页面DOM管理,渲染更新链路更为精简,占用内存更少,应用性能更佳。 
  • 发展趋势:声明式开发范式后续会作为主推的开发范式持续演进,为开发者提供更丰富、更强大的能力。

方舟开发框架示意图:

常用的UI组件

1、Image组件

        声明Image组件并设置图片源

                Image(src:string|PixelMap|Resource        

        ① string格式,通常用来加载网络图片,需要申请网络访问权限:ohos.permission.INTERNET

                Image('https://xxxxx.png')

        ② PixelMap格式,以加载像素图,常用在图片编辑中

                Image(pixelMapObject)

        ③ Resource格式,加载本地图片

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

                Image($rowfile('icon.png'))

              使用$rowfile  得到的icon图片放在了rawfile里面         

              使用$r 得到的图片在media文件夹下

    

图片属性: width() 高度  ,height()宽度 , borderRadius() 边框圆角 , interpolation()图片插值(弥补像素锯齿)

 Image($rawfile('car.png'))
          .backgroundColor('#fff000')
          .width(200) //宽度
          .borderRadius(50) //圆角 
Image('http://t14.baidu.com/it/u=3542627100,2757422516&fm=224&app=112&f=JPEG?w=363&h=500')
          .height(300)

效果图  

这是在预览器上显示的,网络图片如果要显示在模拟器或者真机上,需要申请网络权限

官网地址 文档中心

在工程目录中找到如果所示的module.json5文件添加网络权限

这样我们就可以在模拟器和真机上显示网络图片了。

2、文本组件 Text/Span

Text是文本组件,通常用于展示用户的视图,如显示文章的文字。

声明Text组件并设置文本内容

                                Text(content?:string|Resource)

①string格式,直接填写文本内容    Text("文本content")

②Resource格式,读取本地资源文件

                Text($r('app.string.tab_Home'))  //读取tab的首页文本,对应中英文,实现国际化

文本属性  

  lineHeight()行高   fontSize()字体大小    fontColor()字体颜色  fontWeight()字体粗细 padding()内间距,margin()外边距

Text($r('app.string.module_desc'))
  .baselineOffset(0)
  .fontSize(30)
  .border({ width: 1 })
  .padding(10)
  .width(300)
  .margin(20)
添加子组件

Span只能作为Text组件的子组件显示文本内容。可以在一个Text内添加多个Span来显示一段信息,例如产品说明书、承诺书等。

Span组件需要写到Text组件内,单独写Span组件不会显示信息,Text与Span同时配置文本内容时,Span内容覆盖Text内容。

创建Span

Text('我是Text') {
          Span('我是Span')
        }
        .padding(10)
        .borderWidth(1)
        .margin(30)

设置文本装饰线及颜色 , 通过decoration设置文本装饰线及颜色。

Text() {
          Span('我是Span1,').fontSize(16).fontColor(Color.Grey)
            .decoration({ type: TextDecorationType.LineThrough, color: Color.Red })
          Span('我是Span2').fontColor(Color.Blue).fontSize(16)
            .fontStyle(FontStyle.Italic)
            .decoration({ type: TextDecorationType.Underline, color: Color.Black })
          Span(',我是Span3').fontSize(16).fontColor(Color.Grey)
            .decoration({ type: TextDecorationType.Overline, color: Color.Green })
        }
        .borderWidth(1)
        .padding(10)
        .margin(30)

通过TextCase设置文字一直保持大写或者小写状态

Text() {
  Span('I am Upper-span').fontSize(12)
    .textCase(TextCase.UpperCase)
}

这样文本的字体都是大写的

添加事件

由于Span组件无尺寸信息,事件仅支持点击事件onClick。

Text() {
          Span('I am Upper-span').fontSize(12)
            .textCase(TextCase.UpperCase)
            .onClick(()=>{
              console.info('Span点击了!!!')
            })
        }.margin(40)

这样点击span会有点击事件的响应

自定义组件
①通过textAlign属性设置文本对齐样式
Text('左对齐')
  .width(300)
  .textAlign(TextAlign.Start)
  .border({ width: 1 })
  .padding(10)
Text('中间对齐')
  .width(300)
  .textAlign(TextAlign.Center)
  .border({ width: 1 })
  .padding(10)
Text('右对齐')
  .width(300)
  .textAlign(TextAlign.End)
  .border({ width: 1 })
  .padding(10)
TextAlign是枚举,有Start、Center、End
②通过textOverflow属性控制文本超长处理

textOverflow需配合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.')
          .width(250)
          .textOverflow({ overflow: TextOverflow.None })
          .maxLines(1)
          .fontSize(12)
          .border({ width: 1 }).padding(10)
    Text('我是超长文本,超出的部分显示省略号。I am an extra long text, with ellipses displayed for any excess。')
          .width(250)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
          .maxLines(1)
          .fontSize(12)
          .border({ width: 1 }).padding(10)

TextOverflow是枚举,有Clip裁切  Ellipsis省略号 None不裁切

  如果去掉maxLines文本会自动折行

  ③通过lineHeight属性设置文本行高
Text('This is the text with the line height set. This is the text with the line height set.')
  .width(300).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.')
  .width(300).fontSize(12).border({ width: 1 }).padding(10)
  .lineHeight(20)
    
④通过decoration属性设置文本装饰线样式及其颜色
Text('This is the text')
  .decoration({
    type: TextDecorationType.LineThrough,
    color: Color.Red
  })
  .borderWidth(1).padding(10).margin(5)
Text('This is the text')
  .decoration({
    type: TextDecorationType.Overline,
    color: Color.Red
  })
  .borderWidth(1).padding(10).margin(5)
Text('This is the text')
  .decoration({
    type: TextDecorationType.Underline,
    color: Color.Red
  })
  .borderWidth(1).padding(10).margin(5)

⑤通过baselineOffset属性设置文本基线的偏移量
Text('This is the text content with baselineOffset 0.')
  .baselineOffset(0)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
  .margin(5)
Text('This is the text content with baselineOffset 30.')
  .baselineOffset(30)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
  .margin(5)

Text('This is the text content with baselineOffset -20.')
  .baselineOffset(-20)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
  .margin(5)

⑥通过letterSpacing属性设置文本字符间距
Text('This is the text content with letterSpacing 0.')
  .letterSpacing(0)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
  .margin(5)
Text('This is the text content with letterSpacing 3.')
  .letterSpacing(3)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
  .margin(5)
Text('This is the text content with letterSpacing -1.')
  .letterSpacing(-1)
  .fontSize(12)
  .border({ width: 1 })
  .padding(10)
  .width('100%')
  .margin(5)

⑦通过minFontSize与maxFontSize自适应字体大小
Text('我的最大字号为30,最小字号为5,宽度为250,maxLines为1')
  .width(250)
  .maxLines(1)
  .maxFontSize(30)
  .minFontSize(5)
  .border({ width: 1 })
  .padding(10)
  .margin(5)
Text('我的最大字号为30,最小字号为5,宽度为250,maxLines为2')
  .width(250)
  .maxLines(2)
  .maxFontSize(30)
  .minFontSize(5)
  .border({ width: 1 })
  .padding(10)
  .margin(5)
Text('我的最大字号为30,最小字号为15,宽度为250,高度为50')
  .width(250)
  .height(50)
  .maxFontSize(30)
  .minFontSize(15)
  .border({ width: 1 })
  .padding(10)
  .margin(5)
Text('我的最大字号为30,最小字号为15,宽度为250,高度为100')
  .width(250)
  .height(100)
  .maxFontSize(30)
  .minFontSize(15)
  .border({ width: 1 })
  .padding(10)
  .margin(5)
⑧通过textCase属性设置文本大小写
Text('This is the text content with textCase set to Normal.')
  .textCase(TextCase.Normal)
  .padding(10)
  .border({ width: 1 })
  .padding(10)
  .margin(5)

// 文本全小写展示
Text('This is the text content with textCase set to LowerCase.')
  .textCase(TextCase.LowerCase)
  .border({ width: 1 })
  .padding(10)
  .margin(5)

// 文本全大写展示
Text('This is the text content with textCase set to UpperCase.')
  .textCase(TextCase.UpperCase)
  .border({ width: 1 })
  .padding(10)
  .margin(5)
⑨通过copyOption属性设置文本是否可复制粘贴
Text("这是一段可复制文本")
  .fontSize(30)
  .copyOption(CopyOptions.InApp)

CopyOptions是枚举有none不允许拷贝,InApp只允许在app内 ,LocationDevice 本地设备
添加事件

Text组件可以添加通用事件,可以绑定onClick、onTouch等事件来响应操作。

 Text("这个文本可点击")
          .fontSize(30)
          .onClick(()=>{
            console.log("点击的这个文本")
          })

 

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

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

相关文章

AI大模型学习在医疗领域的应用与挑战

AI大模型学习在医疗领域的应用与挑战 文章正文:一、AI大模型学习在医疗领域的应用二、AI大模型学习在医疗领域面临的挑战总结: 文章正文: 随着人工智能技术的飞速发展,AI大模型学习在各个领域都取得了显著的成果。本文将探讨AI大…

使用Sui CLI在Sui上创建和执行PTBs

Sui命令行界面(CLI)中的新命令允许用户直接从终端或Bash脚本创建和执行可编程交易区块(PTB)。这个新命令为开发人员在实现和执行PTB方面提供了更大的灵活性。 PTB为开发人员提供了一种非常强大的编程工具,这在其他区块…

商务口语每天学习,柯桥英语培训

今天天气好 Its a nice day today. 今天天气真好。(搭讪) Ive heard too much about you. 久仰大名。(恭维) Remember me to... 请代我向……问好。(问候) 半个句型要记牢 Its a ~(nice/good/bad) day today. Tip: 如果你想和某人搭讪而找不着好的借口时,就说天气…

Macs Fan Control Pro--精准掌控Mac风扇,优化散热新选择

Macs Fan Control Pro是一款专为Mac电脑设计的高级风扇控制工具。它具备强大的温度监测能力,可以实时监测Mac电脑各个核心组件的温度,并通过直观的界面展示给用户。同时,用户可以根据个人需求自定义风扇速度,或者选择预设的自动风…

【STL】vector的模拟实现

目录 前言 vector概述 vector的数据结构 vector迭代器的运用 vector的构造和析构 vector的拷贝构造与赋值 拷贝构造 传统写法 现代写法 赋值重载 vector的扩容 reserve() resize() vector的元素操作 push_back() pop_back() insert() erase() 迭代器…

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的,在将 TLS 证书部署服务端时,证书文件其实就是服务端的公钥,会在 TLS 握手阶段传递给客户端,而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中,客户端会…

算法学习——LeetCode力扣动态规划篇5(198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III )

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣(LeetCode) 描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

Python|OpenCV-实现检测人脸以及性别检测(12)

前言 本文是该专栏的第13篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 性别检测是计算机视觉领域里面的一个重要学习领域,简单的来说,它可以实现自动识别一张图片中的人物性别。为此在本文中,笔者将结合OpenCV和Tensorflow来实现对一张图进行“图片中的人物人…

探索c++:string常用接口 迷雾

个人主页:日刷百题 系列专栏:〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 🌎欢迎各位→点赞👍收藏⭐️留言📝 ​ ​ 一、string类 这里我们对string类进行一个简单的总结: string是表示字符串的字…

【更新】在湘源7、8中使用2023年11月国空用地用海分类

之前为了做控规,从湘源8中扒了一套国空用地用海的绘图参数给湘源7使用。 【预告】在湘源控规7中使用 国空用地用海分类标准 但是部里在2023年11月又发布了一套新的用地用海分类。 本想去湘源8里面再扒一下,结果发现湘源8自己还没有更新呢,…

使用STM32 MCU模拟实现PPS+TOD授时信号

简介 PPSTOD是授时信号的一种,用来传递准确的时间信息。 PPS,Pulse Per Second,是每秒一次的脉冲信号,其上升沿表示整秒的时刻。TOD,Time of Day,是时间信息。是跟随在每个PPS信号后的由串口发出的一句报…

Servlet Response的常用方法 缓存和乱码处理

前言 Servlet Response相关的信息,在service方法中使用的是HttpServletResponse,它继承自ServletResponse,扩展了Http协议相关的内容,下面简单记录一下它的基本用法。 一、response组成内容 以下是一个常见response响应的内容&…

红黑树介绍及插入操作的实现

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

node.js的错误处理

当我打开一个不存在的文件时,错误如下: 在读取文件里面写入console.log(err),在控制台中可以看到我的错误代码类型:文件不存在的错误代码 ENOENT。见更多错误代码---打开node.js官方API文档Error 错误 | N…

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中,高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议,扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁,更是实现信息高效传递的关键。今天,我们就来揭开从DeviceNET到…

每日面经分享(pytest入门)

1. pytest具有什么功能 a. 自动发现和执行测试用例:pytest可以自动发现项目中的测试文件和测试函数,无需手动编写测试套件或测试运行器。 b. 丰富的断言函数:pytest提供了丰富的断言函数,方便地验证测试结果是否符合预期。断言函…

【STM32 HAL库SPI/QSPI协议学习,基于外部Flash读取】

1、SPI协议 简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。 通信方式:同…

基于SpringBoot+Vue交通管理在线服务系统的开发(源码+部署说明+演示视频+源码介绍+lw)

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

Docker搭建LNMP环境实战(10):大结局!脚本化一次性安装测试、生产环境

实现使用 Docker 在一台服务器上搭建支持 80、443 端口访问的测试、生产双站点系统。 1、生产环境&测试环境的规划和部署 1.1、说明 图1 系统部署示意图 1)项目 此处以一个演示项目的形式来进行环境的规划和部署。此项目名称默认定义为:“demo”&a…