2、基础组件入门:Text、Button、Image、TextInput 与通用属性

好,咱们今天聊聊鸿蒙开发里最基础、也最常用的几个组件。说实话,不管多复杂的界面,最后拆解下来,都是这些基础组件的组合。我刚开始接触鸿蒙时,也以为这些组件很简单,不就是显示文字、点个按钮嘛。但真正做项目才发现,每个组件都有不少门道。

这一节,我会带着大家把 TextButtonImageTextInput 这四个组件过一遍,再聊聊它们的通用属性。嗯,咱们开始吧。

2.1 Text 组件:不只是显示文字

Text 组件,说白了就是用来展示文本的。但你别小看它,我见过不少新手直接拿它当「万能文本容器」,结果排版乱得一塌糊涂。

先看一个最简单的例子:

Text("你好,鸿蒙!")
    .fontSize(20)
    .fontColor(Color.Blue)
    .fontWeight(FontWeight.Bold)

这段代码会显示一行蓝色、加粗、20号大小的文字。嗯,很直观对吧?

但实际项目中,我们经常需要处理多行文本。比如用户协议、商品描述这些。这时候就要用到 .maxLines().textOverflow() 了。

核心经验: 我建议所有需要展示长文本的地方,都加上 .maxLines() 限制。否则一旦数据异常,整个布局可能被撑变形。

Text("这是一段很长的文本,可能会超出显示区域,我们需要对它进行截断处理。")
    .maxLines(2)
    .textOverflow({ overflow: TextOverflow.Ellipsis })

这样,超过两行的内容就会显示为「...」。用户体验会好很多。

另外,Text 还支持富文本样式。比如你想让一段文字里某些词变颜色:

Text() {
    Span("点击")
    Span("这里").fontColor(Color.Red).fontWeight(FontWeight.Bold)
    Span("查看更多详情")
}

这个技巧我在做「用户协议」页面时用过,效果很不错。

2.2 Button 组件:交互的起点

Button 是用户和界面交互最直接的方式。我个人习惯把按钮分为三类:主按钮、次按钮、文字按钮。

类型 使用场景 样式建议
主按钮 提交、确认、保存 填充色 + 白色文字
次按钮 取消、返回、次要操作 边框 + 透明背景
文字按钮 查看详情、跳转链接 纯文字,无边框

看一个实际例子:

Button("提交订单")
    .type(ButtonType.Capsule)
    .backgroundColor(Color.Blue)
    .fontColor(Color.White)
    .width(200)
    .height(48)
    .onClick(() => {
        console.info("按钮被点击了")
    })

这里我用了 ButtonType.Capsule,就是那种圆角胶囊形状。我个人比较喜欢这种风格,看起来更现代。

注意: 我曾经踩过一个坑——按钮的点击区域太小。用户怎么点都没反应。后来我养成了习惯,所有按钮至少给 44px 的高度,这是手指触摸的最小舒适区。

2.3 Image 组件:图片加载有讲究

Image 组件用来显示图片。但图片加载这件事,坑特别多。你想想看,网络图片加载慢怎么办?图片尺寸不对怎么办?

先看基础用法:

Image($r("app.media.icon"))
    .width(100)
    .height(100)
    .borderRadius(10)

这是加载本地资源。如果是网络图片,需要加 .src()

Image()
    .src("https://example.com/logo.png")
    .width(200)
    .height(100)
    .objectFit(ImageFit.Contain)

这里 .objectFit() 很关键。它决定了图片怎么适应容器:

  • Cover:裁剪填充,会损失边缘内容
  • Contain:完整显示,可能会有留白
  • Fill:拉伸填充,会变形

我建议大部分场景用 Contain。除非你确定图片比例和容器完全一致,否则别用 Fill,变形了很难看。

小技巧: 网络图片加载时,最好加一个占位图。我习惯用 .alt() 属性设置加载失败时的替代图片,这样用户体验不会断档。

2.4 TextInput 组件:用户输入的入口

TextInput 是用户输入文本的组件。说白了就是输入框。但输入框的细节特别多,比如键盘类型、输入限制、占位提示等等。

基础用法:

TextInput({ placeholder: "请输入用户名" })
    .width(300)
    .height(40)
    .type(InputType.Normal)
    .onChange((value: string) => {
        console.info("输入内容:" + value)
    })

这里 .type() 控制键盘类型。我遇到过不少新手,做密码输入框时忘了设置 InputType.Password,结果输入的内容明文显示,这肯定不行。

常用的输入类型:

  • Normal:普通文本
  • Password:密码,显示为圆点
  • Email:邮箱,键盘带 @ 符号
  • Number:数字键盘

避坑指南: 我曾经做过一个登录页面,用户输入密码时,键盘把输入框挡住了。后来我加了 .keyboardAvoid(true) 属性,才解决了这个问题。嗯,这个属性默认是关闭的,记得手动打开。

2.5 组件的通用属性

上面讲的四个组件,虽然功能不同,但有很多共同的属性。我把它们统称为「通用属性」。掌握了这些,你写任何组件都会顺手很多。

我整理了一张表,方便你对照:

属性 作用 示例
width / height 设置宽高 .width(100).height(50)
padding / margin 内边距 / 外边距 .padding(10).margin({ top: 5 })
backgroundColor 背景颜色 .backgroundColor(Color.Red)
borderRadius 圆角 .borderRadius(8)
opacity 透明度 .opacity(0.8)
visibility 可见性 .visibility(Visibility.Hidden)
align 对齐方式 .align(Alignment.Center)

举个例子,给一个按钮加上圆角和阴影:

Button("点击我")
    .width(150)
    .height(45)
    .backgroundColor("#007AFF")
    .borderRadius(22)
    .shadow({ radius: 4, color: Color.Gray, offsetX: 2, offsetY: 2 })

你看,这些属性都是通用的。你可以在 Text、Image、TextInput 上同样使用。说白了,掌握了这些,你就能控制任何组件的外观和布局。

我的建议: 刚开始学的时候,别急着背所有属性。先记住最常用的那几个——宽高、边距、背景色、圆角。其他的用到再查,慢慢就熟了。

知识体系总览

下面这张图,是我为你梳理的本章知识结构。你可以把它当作一个「地图」,随时回来对照:

基础组件入门 Text 组件 Button 组件 Image 组件 TextInput 组件 关键点 • 多行截断 maxLines • 富文本 Span 组合 • 字体颜色/大小控制 关键点 • 三种按钮类型 • 点击事件 onClick • 触摸区域 ≥44px 关键点 • 本地/网络图片加载 • objectFit 适配模式 • 占位图 alt 设置 关键点 • 键盘类型 type • 输入监听 onChange • 键盘避让设置 通用属性:宽高 / 边距 / 背景色 / 圆角 / 透明度 / 对齐 所有组件共享一套通用属性,掌握它们就能快速上手任何组件

好了,这一节的内容就到这里。Text、Button、Image、TextInput 这四个组件,加上通用属性,足够你搭建出大部分常见界面了。记住,多动手写代码,比光看文档强十倍。


公众号:蓝海资料掘金营,微信deep3321