HarmonyOS应用开发实战(基础篇)Day06-《常见组件》

HarmonyOS应用开发实战(基础篇)Day06-《常见组件》


常见组件


Image(图像组件)

Image 是 ArkUI 中用于显示静态或网络图片的核心组件,支持本地资源、网络 URL、Base64 编码等多种图像源格式。在鸿蒙应用开发中,图片资源通常存放在项目的 resources/base/media/ 目录下,通过 $r('app.media.xxx') 方式引用,确保多设备、多语言环境下的资源适配。

基本用法

Image($r('app.media.logo')).width(100).height(100).objectFit(ImageFit.Contain)// 保持宽高比缩放
💡 资源路径说明$r('app.media.xxx') 中的 xxx 为图片文件名(不含扩展名);系统会根据设备分辨率自动选择 media/ 下对应 drawable-xxhdpi 等子目录中的资源。

核心属性

  • width / height:控制显示尺寸,推荐使用 vp 单位;
  • objectFit:定义图片填充方式:
    • ImageFit.Fill:拉伸填满,可能变形;
    • ImageFit.Contain:等比缩放,完整显示;
    • ImageFit.Cover:等比裁剪,填满容器;
  • borderRadius:实现圆角头像效果;
  • alt:设置加载失败时的占位文本(辅助可访问性);
  • loadingStrategy:控制网络图片加载策略(如懒加载)。

使用场景

  • 应用图标、用户头像、商品展示图;
  • 背景装饰图、引导页 Banner;
  • 动态加载远程图片(需配置网络权限)。

注意事项

  • 本地图片必须放入 resources 目录,不能直接使用相对路径;
  • 网络图片需在 module.json5 中声明 ohos.permission.INTERNET 权限
  • 图片过大可能导致内存溢出,建议对高清图做压缩或使用 pixelMap 分片加载。
在这里插入图片描述

Text(文本组件)

Text 是 UI 开发中最基础、最频繁使用的组件,用于显示单行或多行静态文本。ArkTS 的 Text 组件支持丰富的样式定制,包括字体、颜色、对齐、换行、省略等,是构建信息展示类界面的核心元素。

基本用法

Text('Hello, HarmonyOS!').fontSize(16).fontColor('#333333').fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)

核心特性

  • 文本格式化
    • fontSize():字体大小(单位 vp);
    • fontFamily():指定字体族;
    • fontStyle():斜体(FontStyle.Italic);
    • textCase():大小写转换(如全大写);
  • 对齐与布局
    • textAlign():左/中/右对齐;
    • maxLines():限制最大行数;
    • textOverflow():超长文本处理(Ellipsis 显示“…”);
  • 富文本支持(部分版本):
    • 可通过 Span 组件实现局部样式差异(如关键词高亮)。

使用场景

  • 标题、副标题、说明文字;
  • 列表项内容、表单标签;
  • 错误提示、成功反馈文案。

最佳实践

  • 避免硬编码文本,应使用 $r('app.string.xxx') 引用国际化资源;
  • 超长文本务必设置 maxLines(1).textOverflow(TextOverflow.Ellipsis) 防止布局错乱;
  • 深色模式下需动态调整 fontColor 以保证可读性。
在这里插入图片描述

TextInput(输入框组件)

TextInput 提供用户输入文本的能力,支持多种输入类型、提示文本、密码掩码、键盘类型等,是表单交互的关键组件。

基本用法

TextInput({ placeholder:'请输入用户名'}).type(InputType.Text).onChange((value)=>{console.log('输入内容:', value);})

输入类型(type 属性)

ArkTS 提供丰富的 InputType 枚举值,系统会自动匹配对应的软键盘:

类型说明
Text普通文本
Email邮箱(键盘带 @ 和 .)
Number数字(仅数字键盘)
Password密码(自动掩码为 ●)
Phone电话号码(带 + 和 -)
DateTime日期时间(弹出日期选择器)
在这里插入图片描述

密码输入示例

TextInput({ placeholder:'请输入密码'}).type(InputType.Password).passwordIcon(true)// 显示“眼睛”图标切换明文

此时输入内容会被自动替换为圆点符号,提升安全性。

在这里插入图片描述


在这里插入图片描述

其他重要属性

  • placeholder:提示文字;
  • maxLength:限制最大输入长度;
  • onChange / onSubmit:监听输入变化或回车提交;
  • caretColor:光标颜色;
  • selectedBackgroundColor:选中文本背景色。

安全建议

  • 密码字段应禁用自动填充(部分系统支持);
  • 敏感信息输入后应及时清空内存缓存;
  • 避免在日志中打印用户输入内容。

Button(按钮组件)

Button 是触发操作的核心交互控件,常用于提交表单、跳转页面、触发功能等。ArkUI 的 Button 支持文本按钮、图标按钮、自定义样式等多种形态。

基本用法

Button('点击登录').onClick(()=>{console.log('按钮被点击');// 可在此处跳转页面或调用 API}).width('100%').height(50).backgroundColor('#007DFF').fontColor(Color.White)

类型与样式

  • 普通按钮:带背景色和文字;
  • 胶囊按钮:通过 borderRadius(50) 实现;
  • 图标按钮:结合 Image 组件使用;
  • 禁用状态.enabled(false) 自动变灰且不可点击。

交互增强

  • 防重复点击:在 onClick 中添加节流逻辑;
  • 加载状态:点击后替换为 Progress 组件;
  • 无障碍支持:设置 accessibilityText 供读屏软件识别。

使用场景

  • 表单提交、取消操作;
  • 页面跳转入口(如“立即购买”);
  • 功能触发(如“刷新”、“分享”)。
在这里插入图片描述

Swiper(轮播组件)

Swiper 用于实现滑动切换的轮播效果,常用于首页 Banner、商品推荐、引导页等场景。它通过手势滑动或自动播放,在多个子页面间切换。

基本结构

Swiper(){Image($r('app.media.banner1'))Image($r('app.media.banner2'))Image($r('app.media.banner3'))}.index(0)// 初始索引.autoPlay(true)// 自动播放.interval(3000)// 播放间隔(毫秒).loop(true)// 循环播放

核心属性

  • index:当前显示项索引;
  • autoPlay:是否自动轮播;
  • interval:自动切换时间间隔;
  • loop:是否循环(首尾相连);
  • indicator:是否显示指示器(小圆点);
  • duration:滑动动画时长。

注意事项

  • 子组件数量建议 ≤ 5,过多会影响性能;
  • 自动播放时应监听页面生命周期,进入后台时暂停;
  • 可结合 onClick 实现点击跳转详情页。
在这里插入图片描述

List(列表组件)

List 是用于展示大量垂直滚动数据的高性能组件,内部采用懒加载机制,仅渲染可视区域内的项,极大提升内存与渲染效率。

基本用法

List({ space:10}){// space 设置项间距ForEach(this.items,(item:string)=>{ListItem(){Text(item).padding(10).width('100%')}},(item:string)=> item)}.height('100%')

关键特性

  • space:统一设置列表项之间的间距;
  • ListItem:每个列表项必须包裹在 ListItem 中;
  • scroller:可绑定滚动控制器,实现滚动到指定位置;
  • 分组支持:通过 ListItemGroup 实现分组标题。

性能优化

  • 使用 ForEach 而非 for 循环,确保高效更新;
  • 避免在 ListItem 中嵌套复杂布局;
  • 图片建议使用 Image 的懒加载策略。

验证要点

  • 初始加载 4 项符合预期;
  • 文本格式统一;
  • 项间距 10vp 由 space: 10 控制。
在这里插入图片描述

Scroll(滚动容器)

Scroll 是一个通用的单方向滚动容器,适用于内容超出可视区域时的滚动需求。与 List 不同,Scroll 不具备数据驱动能力,更适合静态或少量动态内容的滚动。

使用条件

  • 滚动方向尺寸 > 容器尺寸:例如垂直滚动时,子组件总高度必须大于 Scroll 的高度;
  • 单一子组件限制Scroll 只能直接包含一个子元素,若需多个,必须用 ColumnRow 包裹。
Scroll(){Column(){Text('Item 1')Text('Item 2')// ... 多个子项}.height(800)// 必须大于 Scroll 高度(如 400vp)}.height(400).scrollable(ScrollDirection.Vertical)

嵌套限制

  • 禁止嵌套滚动组件:如 Scroll 内嵌 ListGrid,会导致手势冲突或滚动失效;
  • 替代方案:使用 NestedScroll 或将外层改为 Column + List

行为验证

  • 当内容不足时,Scroll 自动禁用滚动;
  • 滚动方向可通过 .scrollable() 显式指定;
  • 支持绑定 Scroller 控制器实现程序化滚动。


总结

以上六大组件——ImageTextTextInputButtonSwiperListScroll——构成了鸿蒙应用 UI 的基础骨架。掌握它们的特性与适用边界,是高效开发高质量 ArkTS 应用的前提:

  • 静态内容展示Text + Image
  • 用户输入TextInput
  • 交互触发Button
  • 轮播宣传Swiper
  • 大量数据列表List(优先);
  • 少量滚动内容Scroll(谨慎嵌套)。

合理组合这些组件,并遵循单位规范(vp 为主)、空值安全、响应式布局等原则,即可构建出兼容多端、体验流畅的鸿蒙应用界面。

Read more

【Actix Web】Rust Web开发实战:Actix Web框架全面指南

【Actix Web】Rust Web开发实战:Actix Web框架全面指南

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,ZEEKLOG全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。 所属的专栏:Rust语言通关之路 景天的主页:景天科技苑 文章目录 * Rust Web开发 * 一、Actix Web框架概述 * 1.1 Actix Web的特点 * 1.2 Actix Web与其他Rust框架比较

By Ne0inhk
Flutter for OpenHarmony:web_socket 纯 Dart 标准 WebSocket 客户端(跨平台兼容性之王) 深度解析与鸿蒙

Flutter for OpenHarmony:web_socket 纯 Dart 标准 WebSocket 客户端(跨平台兼容性之王) 深度解析与鸿蒙

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 虽然 dart:io 提供了 WebSocket 类,dart:html 也提供了 WebSocket 类,但这种“分裂”的 API 设计让编写跨平台(同时支持 Mobile/Web/Desktop)的代码变得异常痛苦。你需要使用条件导入 (if (dart.library.io) ...) 来分别处理。 web_socket 库就是为了解决这个问题而诞生的。它提供了一个统一的、平台无关的WebSocket 接口。 无论你的代码运行在 Android、iOS、Web 还是 OpenHarmony 上,它都会自动选择最底层的实现(在鸿蒙上通常是 dart:io)

By Ne0inhk
【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题 在开发 Web 应用时,尤其是集成了 Unity WebGL 内容的页面,遇到一个问题:当 Unity WebGL 渲染内容嵌入到一个 Tab 中时,切换 Tab 后画面会变黑,直到用户点击黑屏区域,才会恢复显示。 这个问题通常是因为 Unity 渲染在 Tab 切换时被暂停或未能获得焦点所致。 在本文中,我们将介绍如何在使用 Layui 框架时,通过监听 Tab 切换事件并强制 Unity WebGL 渲染恢复,来解决这一问题。 1. 问题描述 当 Unity WebGL 内容嵌入到页面中的多个

By Ne0inhk

1Panel面板下Open WebUI镜像加速实战:从ghcr.io到国内镜像站的无缝切换

1. 为什么需要镜像加速 在国内使用Docker拉取GitHub Container Registry(ghcr.io)的镜像时,经常会遇到下载速度极慢甚至完全无法连接的问题。这主要是因为ghcr.io的服务器位于海外,国内访问存在网络延迟和带宽限制。以Open WebUI为例,一个3GB左右的镜像可能需要数小时才能下载完成,严重影响开发效率。 我曾经在部署Open WebUI时就遇到过这个问题。当时尝试从ghcr.io直接拉取镜像,速度只有几十KB/s,而且经常中断。后来发现国内高校和云服务商提供了ghcr.io的镜像服务,切换到南京大学镜像源后,下载速度立刻提升到10MB/s以上,整个镜像几分钟就完成了下载。 2. 国内镜像站的选择 目前国内可用的ghcr.io镜像站主要有以下几种: 1. 南京大学镜像站(ghcr.nju.edu.cn):这是最稳定的选择之一,更新频率高,支持匿名拉取 2. 华为云镜像仓库(swr.cn-north-4.myhuaweicloud.com):提供企业级镜像服务,需要登录后使用

By Ne0inhk