常用基础组件
组件介绍
组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。
组件根据功能可以分为以下五大类:
1.基础组件
2.容器组件
3.媒体组件
4.绘制组件
5.画布组件
其中基础组件是视图层的基本组成单元,包括Text、Image、TextInput、Button、LoadingProgress等,例如下面这个常用的登录界面就是由这些基础组件组合而成。
![](https://i-blog.csdnimg.cn/blog_migrate/0729f585b091fe35aa7d9662fd308a15.png)
下面我们将分别介绍这些常用基础组件的使用。
Text
Text组件用于在界面上展示一段文本信息,可以包含子组件Span。
文本样式
针对包含文本元素的组件,例如Text、Span、Button、TextInput等,可使用fontColor、fontSize、fontStyle、 fontWeight、fontFamily这些文本样式,分别设置文本的颜色、大小、样式、粗细以及字体,文本样式的属性如下表
![](https://i-blog.csdnimg.cn/blog_migrate/a0debe51b12008abe8775f3994a22807.png)
下面示例代码中包含两个Text组件,第一个使用的是默认样式,第二个给文本设置了一些文本样式。
@Entry
@Component
struct TextDemo {
build() {
Row() {
Column() {
Text('HarmonyOS')
Text('HarmonyOS')
.fontColor(Color.Blue)
.fontSize(20)
.fontStyle(FontStyle.Italic)
.fontWeight(FontWeight.Bold)
.fontFamily('Arial')
}
.width('100%')
}
.backgroundColor(0xF1F3F5)
.height('100%')
}
}
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/5830234f02453acf64431ca5060ace9e.png)
除了通用属性和文本样式设置,下面列举了一些Text组件的常用属性的使用。
设置文本对齐方式
使用textAlign属性可以设置文本的对齐方式,示例代码如下:
Text('HarmonyOS')
.width(200)
.textAlign(TextAlign.Start)
.backgroundColor(0xE6F2FD)
textAlign参数类型为TextAlign,定义了以下几种类型:
👉Start(默认值):水平对齐首部。
![](https://i-blog.csdnimg.cn/blog_migrate/396315aaa4b4153cbd11cfe79fa62e64.png)
👉Center:水平居中对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/51062301d6412221fa6818e97d3cafc4.png)
👉End:水平对齐尾部。
![](https://i-blog.csdnimg.cn/blog_migrate/e48a1b5303df6b4985e83a4c80a0a2f1.png)
设置文本超长显示
当文本内容较多超出了Text组件范围的时候,您可以使用textOverflow设置文本截取方式,需配合maxLines使用,单独设置不生效,maxLines用于设置文本显示最大行数。下面的示例代码将textOverflow设置为Ellipsis ,它将显示不下的文本用 “...” 表示:
Text('This is the text content of Text Component This is the text content of Text Component')
.fontSize(16)
.maxLines(1)
.textOverflow({overflow:TextOverflow.Ellipsis})
.backgroundColor(0xE6F2FD)
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2aeb5ec4dc5fc263cb5e729be5f5fd27.png)
设置文本装饰线
使用decoration设置文本装饰线样式及其颜色,大家在浏览网页的时候经常可以看到装饰线,例如带有下划线超链接文本。decoration包含type和color两个参数,其中type用于设置装饰线样式,参数类型为TextDecorationTyp,color为可选参数。
下面的示例代码给文本设置了下划线,下划线颜色为黑色:
Text('HarmonyOS')
.fontSize(20)
.decoration({ type: TextDecorationType.Underline, color: Color.Black })
.backgroundColor(0xE6F2FD)
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/42da80b3cd50ee745743f4d7b848d525.png)
TextDecorationTyp包含以下几种类型:
👉None:不使用文本装饰线。
![](https://i-blog.csdnimg.cn/blog_migrate/2f5467e94eb680ebea51d96f4bf9bd28.png)
👉Overline:文字上划线修饰。
![](https://i-blog.csdnimg.cn/blog_migrate/8a49d3dabd9821a0dcbdde7439d3d288.png)
👉LineThrough:穿过文本的修饰线。
![](https://i-blog.csdnimg.cn/blog_migrate/9fc0cb5d156f80043c669a1c3b457e8f.png)
👉Underline:文字下划线修饰。
![](https://i-blog.csdnimg.cn/blog_migrate/21a25e367f6fff627c64314d1929f177.png)
Image
Image组件用来渲染展示图片,它可以让界面变得更加丰富多彩。只需要给Image组件设置图片地址、宽和高,图片就能加载出来,示例如下:
Image($r("app.media.icon"))
.width(100)
.height(100)
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/03d709de7cc0d657a08d49e198635f23.png)
设置缩放类型
为了使图片在页面中有更好的显示效果,有时候需要对图片进行缩放处理。您可以使用objectFit属性设置图片的缩放类型,objectFit的参数类型为ImageFit。
现有原始图片如下:
![](https://i-blog.csdnimg.cn/blog_migrate/21c4f2ac840203df3c64561b6560e3ba.png)
将图片加载到Image组件,设置宽高各100,设置objectFit为Cover(默认值),设置图片背景色为灰色0xCCCCCC。示例代码如下:
Image($r("app.media.image2"))
.objectFit(ImageFit.Cover)
.backgroundColor(0xCCCCCC)
.width(100)
.height(100)
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/964115c45162da21a88900e6a21899af.png)
ImageFit包含以下几种类型:
👉Contain:保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内。
![](https://i-blog.csdnimg.cn/blog_migrate/7df722d2fc5fae66a4198d698b26c19d.png)
👉Cover(默认值):保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
![](https://i-blog.csdnimg.cn/blog_migrate/ee876698dc8d7a9185472789be4970f0.png)
👉Auto:自适应显示。
![](https://i-blog.csdnimg.cn/blog_migrate/2ca49aeae1f12718f4f41a2e2aead462.png)
👉Fill:不保持宽高比进行放大缩小,使得图片充满显示边界。
![](https://i-blog.csdnimg.cn/blog_migrate/3afa1fdb89d3876f3a2db200416b8fdf.png)
👉ScaleDown:保持宽高比显示,图片缩小或者保持不变。
![](https://i-blog.csdnimg.cn/blog_migrate/44be631881403f55bd4f3f67f1a93f6b.png)
👉None:保持原有尺寸显示。
![](https://i-blog.csdnimg.cn/blog_migrate/c6f8c6ab6d57d7252d87dc44e2c561b8.png)
加载网络图片
比如浏览新闻的时候,图片一般从网络加载而来,Image组件支持加载网络图片,将图片地址换成网络图片地址进行加载。
Image('https://www.example.com/xxx.png')
为了成功加载网络图片,您需要在module.json5文件中申明网络访问权限。
{
"module" : {
"requestPermissions":[
{
"name": "ohos.permission.INTERNET"
}
]
}
}
说明:
应用访问网络需要申请ohos.permission.INTERNET权限,因为HarmonyOS提供了一种访问控制机制即应用权限,用来保证这些数据或功能不会被不当或恶意使用。关于应用权限的的详细信息开发者可以参考:访问控制。
TextInput
TextInput组件用于输入单行文本,响应输入事件。TextInput的使用也非常广泛,例如应用登录账号密码、发送消息等。和Text组件一样,TextInput组件也支持文本样式设置,下面的示例代码实现了一个简单的输入框:
TextInput()
.fontColor(Color.Blue)
.fontSize(20)
.fontStyle(FontStyle.Italic)
.fontWeight(FontWeight.Bold)
.fontFamily('Arial')
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/33dacafd01a27ea46c204ce24df9b408.png)
设置输入提示文本
当我们平时使用输入框的时候,往往会有一些提示文字。例如登录账号的时候会有“请输入账号”这样的文本提示,当用户输入内容之后,提示文本就会消失,这种提示功能使用placeholder属性就可以轻松的实现。您还可以使用placeholderColor和placeholderFont分别设置提示文本的颜色和样式,示例代码如下:
TextInput({ placeholder: '请输入帐号' })
.placeholderColor(0x999999)
.placeholderFont({ size: 20, weight: FontWeight.Medium, family: 'cursive', style: FontStyle.Italic })
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/d9cc54249fe8bdbef528b98afd5f3aed.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e39ffafd9d7f3677907c65c67c24e5dd.png)
设置输入类型
可以使用type属性来设置输入框类型。例如密码输入框,一般输入密码的时候,为了用户密码安全,内容会显示为“......”,针对这种场景,将type属性设置为InputType.Password就可以实现。示例代码如下:
TextInput({ placeholder: '请输入密码' })
.type(InputType.Password)
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/9e35aafc0e4b280535b981286490eda8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/23742283a20d3227c3e4fa9fce09618d.png)
type的参数类型为InputType,包含以下几种输入类型:
👉Normal:基本输入模式。支持输入数字、字母、下划线、空格、特殊字符。
![](https://i-blog.csdnimg.cn/blog_migrate/481dcaabeb3950c3a7cc3f4d9373e471.png)
👉Password:密码输入模式。
![](https://i-blog.csdnimg.cn/blog_migrate/1b0d9e00cf3f44b48baf1351e622549f.png)
👉Email:e-mail地址输入模式。
![](https://i-blog.csdnimg.cn/blog_migrate/e164d5548a6b1e6496cb8f1aab176970.png)
👉Number:纯数字输入模式。
![](https://i-blog.csdnimg.cn/blog_migrate/fe924a969ab2bfa9d9d16362daf16d07.png)
设置光标位置
可以使用TextInputController动态设置光位置,下面的示例代码使用TextInputController的caretPosition方法,将光标移动到了第二个字符后。
@Entry
@Component
struct TextInputDemo {
controller: TextInputController = new TextInputController()
build() {
Column() {
TextInput({ controller: this.controller })
Button('设置光标位置')
.onClick(() => {
this.controller.caretPosition(2)
})
}
.height('100%')
.backgroundColor(0xE6F2FD)
}
}
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/962121f24cbdf9306f9cbb8ec93163db.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e1c2cf5a88c81d3226df6009392cbcad.png)
获取输入文本
我们可以给TextInput设置onChange事件,输入文本发生变化时触发回调,下面示例代码中的value为实时获取用户输入的文本信息。
@Entry
@Component
struct TextInputDemo {
@State text: string = ''
build() {
Column() {
TextInput({ placeholder: '请输入账号' })
.caretColor(Color.Blue)
.onChange((value: string) => {
this.text = value
})
Text(this.text)
}
.alignItems(HorizontalAlign.Center)
.padding(12)
.backgroundColor(0xE6F2FD)
}
}
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/26b6b13f3003251eebdebf6ca39d2b40.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6d091971c5980f701b02414c326fe9ac.png)
Button
Button组件主要用来响应点击操作,可以包含子组件。下面的示例代码实现了一个“登录按钮”:
Button('登录', { type: ButtonType.Capsule, stateEffect: true })
.width('90%')
.height(40)
.fontSize(16)
.fontWeight(FontWeight.Medium)
.backgroundColor('#007DFF')
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/554860e23d97aece7b7e95d3cc488c08.png)
设置按钮样式
type用于定义按钮样式,示例代码中ButtonType.Capsule表示胶囊形按钮;stateEffect用于设置按钮按下时是否开启切换效果,当状态置为false时,点击效果关闭,默认值为true。
我们可以设置多种样式的Button,除了Capsule可以以设置Normal和Circle:
👉Capsule:胶囊型按钮(圆角默认为高度的一半)。
![](https://i-blog.csdnimg.cn/blog_migrate/d4240bee27887bd0affc5291841a9dd2.png)
👉Circle:圆形按钮。
![](https://i-blog.csdnimg.cn/blog_migrate/a8ec406a810baa00ac1c791fb72ad75a.png)
👉Normal:普通按钮(默认不带圆角)。
![](https://i-blog.csdnimg.cn/blog_migrate/1cbe291807ac71f18dd3803d3946a1a6.png)
设置按钮点击事件
可以给Button绑定onClick事件,每当用户点击Button的时候,就会回调执行onClick方法,调用里面的逻辑代码。
Button('登录', { type: ButtonType.Capsule, stateEffect: true })
...
.onClick(() => {
// 处理点击事件逻辑
})
包含子组件
Button组件可以包含子组件,让您可以开发出更丰富多样的Button,下面的示例代码中Button组件包含了一个Image组件:
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c94ec9285bf57602b6c11ee4376b1c7e.png)
6 LoadingProgress
LoadingProgress组件用于显示加载进展,比如应用的登录界面,当我们点击登录的时候,显示的“正在登录”的进度条状态。LoadingProgress的使用非常简单,只需要设置颜色和宽高就可以了。
LoadingProgress()
.color(Color.Blue)
.height(60)
.width(60)
效果图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8e16aeacd6208bed6d3aa46263059a1d.gif)
7 使用资源引用类型
Resource是资源引用类型,用于设置组件属性的值。推荐大家优先使用Resource类型,将资源文件(字符串、图片、音频等)统一存放于resources目录下,便于开发者统一维护。同时系统可以根据当前配置加载合适的资源,例如,开发者可以根据屏幕尺寸呈现不同的布局效果,或根据语言设置提供不同的字符串。
例如下面的这段代码,直接在代码中写入了字符串和数字这样的硬编码。
Button('登录', { type: ButtonType.Capsule, stateEffect: true })
.width(300)
.height(40)
.fontSize(16)
.fontWeight(FontWeight.Medium)
.backgroundColor('#007DFF')
我们可以将这些硬编码写到entry/src/main/resources下的资源文件中。
在string.json中定义Button显示的文本。
{
"string": [
{
"name": "login_text",
"value": "登录"
}
]
}
在float.json中定义Button的宽高和字体大小。
{
"float": [
{
"name": "button_width",
"value": "300vp"
},
{
"name": "button_height",
"value": "40vp"
},
{
"name": "login_fontSize",
"value": "18fp"
}
]
}
在color.json中定义Button的背景颜色。
{
"color": [
{
"name": "button_color",
"value": "#1890ff"
}
]
}
然后在Button组件通过“$r('app.type.name')”的形式引用应用资源。app代表应用内resources目录中定义的资源;type代表资源类型(或资源的存放位置),可以取“color”、“float”、“string”、“plural”、“media”;name代表资源命名,由开发者定义资源时确定。
Button($r('app.string.login_text'), { type: ButtonType.Capsule })
.width($r('app.float.button_width'))
.height($r('app.float.button_height'))
.fontSize($r('app.float.login_fontSize'))
.backgroundColor($r('app.color.button_color'))
Column&Row组件的使用
概述
一个丰富的页面需要很多组件组成,那么,我们如何才能让这些组件有条不紊地在页面上布局呢?这就需要借助容器组件来实现。
容器组件是一种比较特殊的组件,它可以包含其他的组件,而且按照一定的规律布局,帮助开发者生成精美的页面。容器组件除了放置基础组件外,也可以放置容器组件,通过多层布局的嵌套,可以布局出更丰富的页面。
ArkTS为我们提供了丰富的容器组件来布局页面,本文将以构建登录页面为例,介绍Column和Row组件的属性与使用。
![](https://i-blog.csdnimg.cn/blog_migrate/58a1b0ded2430a798ce49d98e94153d6.png)
组件介绍
布局容器概念
线性布局容器表示按照垂直方向或者水平方向排列子组件的容器,ArkTS提供了Column和Row容器来实现线性布局。
Column表示沿垂直方向布局的容器。
Row表示沿水平方向布局的容器。
主轴和交叉轴概念
在布局容器中,默认存在两根轴,分别是主轴和交叉轴,这两个轴始终是相互垂直的。不同的容器中主轴的方向不一样的。
👉主轴:在Column容器中的子组件是按照从上到下的垂直方向布局的,其主轴的方向是垂直方向;在Row容器中的组件是按照从左到右的水平方向布局的,其主轴的方向是水平方向。
图2-1 Column容器&Row容器主轴
![](https://i-blog.csdnimg.cn/blog_migrate/a63d2d70faf1d97d4cf340e666b152d2.png)
👉交叉轴:与主轴垂直相交的轴线,如果主轴是垂直方向,则交叉轴就是水平方向;如果主轴是水平方向,则交叉轴是垂直方向。
图2-2 Column容器&Row容器交叉轴
![](https://i-blog.csdnimg.cn/blog_migrate/26d080a64d3131b3f80f33ca085721e6.png)
属性介绍
了解布局容器的主轴和交叉轴,主要是为了让大家更好地理解子组件在主轴和交叉轴的排列方式。
接下来,我们将详细讲解Column和Row容器的两个属性justifyContent和alignItems。
![](https://i-blog.csdnimg.cn/blog_migrate/e28ea4257f4355d065b515b5a37d5221.png)
1. 主轴方向的对齐(justifyContent)
子组件在主轴方向上的对齐使用justifyContent属性来设置,其参数类型是FlexAlign。FlexAlign定义了以下几种类型:
👉Start:元素在主轴方向首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/86792599cca8a3afb5d9c5548a86b6b4.png)
👉Center:元素在主轴方向中心对齐,第一个元素与行首的距离以及最后一个元素与行尾距离相同。
![](https://i-blog.csdnimg.cn/blog_migrate/afc60b9e96ac1af67e98af7ed051c026.png)
👉End:元素在主轴方向尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/0872fe5fa8b5530e166a862d975dec1b.png)
👉SpaceBetween:元素在主轴方向均匀分配弹性元素,相邻元素之间距离相同。 第一个元素与行首对齐,最后一个元素与行尾对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/d29d63ccb8b6c4e0b7945283865a5164.png)
👉SpaceAround:元素在主轴方向均匀分配弹性元素,相邻元素之间距离相同。 第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。
![](https://i-blog.csdnimg.cn/blog_migrate/8dbb90a48cdfb49d552f72f548283c9e.png)
👉SpaceEvenly:元素在主轴方向等间距布局,无论是相邻元素还是边界元素到容器的间距都一样。
![](https://i-blog.csdnimg.cn/blog_migrate/2dd88088fe4edc76d9e808896ff66b8a.png)
2. 交叉轴方向的对齐(alignItems)
子组件在交叉轴方向上的对齐方式使用alignItems属性来设置。
Column容器的主轴是垂直方向,交叉轴是水平方向,其参数类型为HorizontalAlign(水平对齐),HorizontalAlign定义了以下几种类型:
👉Start:设置子组件在水平方向上按照起始端对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/42dfd68bff1195eb9faf61e409972e97.png)
👉Center(默认值):设置子组件在水平方向上居中对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/db321c575d09c2a72f604cb0212016a1.png)
👉End:设置子组件在水平方向上按照末端对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/9c872627d8e4fd26af344b175d21db24.png)
Row容器的主轴是水平方向,交叉轴是垂直方向,其参数类型为VerticalAlign(垂直对齐),VerticalAlign定义了以下几种类型:
👉Top:设置子组件在垂直方向上居顶部对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/00f4a926fbb09fb8dfad5e96f6a707e0.png)
👉Center(默认值):设置子组件在竖直方向上居中对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/dd4cddeaa008a284876eb1fc59fda391.png)
👉Bottom:设置子组件在竖直方向上居底部对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/6de35ad508e41c63583e9f9db13747e9.png)
接口介绍
接下来,我们介绍Column和Row容器的接口。
![](https://i-blog.csdnimg.cn/blog_migrate/a7089c82647ea281a8adb6660bbaef85.png)
Column和Row容器的接口都有一个可选参数space,表示子组件在主轴方向上的间距。
效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/23d8080f86d6237e96baa345b750cace.png)
组件使用
我们来具体讲解如何高效的使用Column和Row容器组件来构建这个登录页面。
当我们从设计同学那拿到一个页面设计图时,我们需要对页面进行拆解,先确定页面的布局,再分析页面上的内容分别使用哪些组件来实现。
我们仔细分析这个登录页面。在静态布局中,组件整体是从上到下布局的,因此构建该页面可以使用Column来构建。在此基础上,我们可以看到有部分内容在水平方向上由几个基础组件构成,例如页面中间的短信验证码登录与忘记密码以及页面最下方的其他方式登录,那么构建这些内容的时候,可以在Column组件中嵌套Row组件,继而在Row组件中实现水平方向的布局。
![](https://i-blog.csdnimg.cn/blog_migrate/49f2dcd03895517e8be89270c10ff165.png)
根据上述页面拆解,在Column容器里,依次是Image、Text、TextInput、Button等基础组件,还有两组组件是使用Row容器组件来实现的,主要代码如下:
@Entry
@Component
export struct LoginPage {
build() {
Column() {
Image($r('app.media.logo'))
...
Text($r('app.string.login_page'))
...
Text($r('app.string.login_more'))
...
TextInput({ placeholder: $r('app.string.account') })
...
TextInput({ placeholder: $r('app.string.password') })
...
Row() {
Text($r(…))
Text($r(…))
}
Button($r('app.string.login'), { type: ButtonType.Capsule, stateEffect: true })
...
Row() {
this.imageButton($r(…))
this.imageButton($r(…))
this.imageButton($r(…))
}
...
}
...
}
}
我们详细看一下使用Row容器的两组组件。
两个文本组件展示的内容是按水平方向布局的,使用两端对齐的方式。这里我们使用Row容器组件,并且需要配置主轴上(水平方向)的对齐格式justifyContent为FlexAlign.SpaceBetween(两端对齐)。
Row() {
Text($r(…))
Text($r(…))
}
.justifyContent(FlexAlign.SpaceBetween)
.width('100%')
其他登录方式的三个按钮也是按水平方向布局的,同样使用Row容器组件。这里按钮的间距是一致的,我们可以通过配置可选参数space来设置按钮间距,使子组件间距一致。
Row({ space: CommonConstants.LOGIN_METHODS_SPACE }) {
this.imageButton($r(…))
this.imageButton($r(…))
this.imageButton($r(…))
}
至此,你已经完成这个登录页面的简单布局实现了。你可以参考《常用组件与布局》这个Codelab验证一下页面效果。
另外,你也可以通过《常用布局容器对齐方式》这个Codelab来深入学习Column、Row、Flex、Stack容器组件的对齐方式,掌握更多布局容器的使用方法。
参考资料
常用基础的组件的更多使用方法可以参考:
引用资源类型的使用可以参考:
Column组件的相关API参考:Column组件。
Row组件的相关API参考:Row组件。
视频及详细文档请点击下链接: