鸿蒙应用的用户体验很大程度上取决于界面设计的合理性与美观度,而ArkUI框架作为鸿蒙生态的核心UI开发体系,提供了丰富的基础组件和灵活的布局方案。本文将系统解析ArkUI组件库的核心组件用法,深入讲解弹性布局、响应式设计及多端适配技巧,通过实战案例演示如何构建跨设备的高性能UI界面。
Text("标题文本")
.fontSize(32) // 字体大小
.fontWeight(FontWeight.Bold)// 字体粗细
.fontFamily("sans-serif") // 字体系列
.lineHeight(40) // 行高
.maxLines(2) // 最大显示行数
.ellipsis() // 超出省略
.textAlign(TextAlign.Center)// 文本对齐
Image($r("app.media.banner")) // 本地资源图片
.width(300)
.height(200)
.objectFit(ImageFit.Cover) // 图片填充模式
.borderRadius(16) // 圆角
.aspectRatio(16/9) // 宽高比
.placeholder(Column() { // 加载占位图
Text("加载中...").fontSize(14);
})
Button("主操作按钮")
.type(ButtonType.Capital) // 按钮样式
.shape(Shape.Rectangle) // 形状
.margin(10)
.padding(16, 32) // 内边距
.backgroundColor(Color.Primary)
.fontColor(Color.White)
.onClick(() => { // 点击事件
// 业务逻辑处理
})
.disabled(!isButtonEnabled) // 禁用状态
@State inputValue: string = "";
Input(this.inputValue)
.placeholder("请输入内容")
.fontSize(16)
.padding(12, 16)
.border({ width: 1, color: "#E5E5E5" })
.borderRadius(24)
.onChange((value: string) => { // 内容变更监听
this.inputValue = value;
})
Column({ space: 20 }) { // 子组件间距20px
Text("Item 1").fontSize(18);
Text("Item 2").fontSize(18);
Text("Item 3").fontSize(18);
}
.width("100%") // 占父容器宽度100%
.justifyContent(FlexAlign.Center) // 垂直居中
.alignItems(ItemAlign.Center) // 水平居中
.padding(32)
Row({ space: 16, wrap: Wrap.On }) { // 子组件换行
ForEach(items, (item) => {
Button(item.name)
.width(100)
.height(40);
}, item => item.id)
}
.width("100%")
.padding(16)
Flex({
direction: FlexDirection.Column, // 垂直方向
justifyContent: FlexAlign.SpaceEvenly, // 均匀分布
alignItems: ItemAlign.Stretch, // 拉伸填充
flexWrap: FlexWrap.Wrap // 允许换行
}) {
Text("Flex Item 1").flexGrow(1); // 弹性增长因子
Text("Flex Item 2").flexShrink(1); // 弹性收缩因子
Text("Flex Item 3").flexBasis("50%"); // 基准尺寸
}
.height(300)
.border({ width: 1, color: "#EEE" })
Grid() {
GridItem() { Text("1") } .gridArea(GridArea.Row1Column1);
GridItem() { Text("2") } .gridArea(GridArea.Row1Column2);
GridItem() { Text("3") } .gridArea(GridArea.Row2Column1);
GridItem() { Text("4") } .gridArea(GridArea.Row2Column2);
}
.columnsTemplate("1fr 1fr") // 两列等分
.rowsTemplate("100px 100px") // 两行固定高度
.gap(8) // 网格间距
.padding(16)
import { Breakpoint, AppStorage } from '@ohos.application';
@Entry
struct ResponsiveLayout {
build() {
if (AppStorage.Get(Constant.Breakpoint) === Breakpoint.SM) {
// 手机端布局(宽度<720px)
Column() { /* 单列布局 */ }
} else if (AppStorage.Get(Constant.Breakpoint) === Breakpoint.MD) {
// 平板端布局(720px≤宽度<1280px)
Row() { /* 双列布局 */ }
} else {
// 大屏设备布局(宽度≥1280px)
Grid() { /* 网格布局 */ }
}
}
}
@Builder
AdaptiveText(content: string, size: number) {
Text(content)
.fontSize(px2vp(size)) // 视口单位转换
.margin(px2vp(16));
}
// 工具函数:像素转视口单位(适配不同屏幕尺寸)
function px2vp(px: number): string {
let width = AppStorage.Get(Constant.ContainerWidth);
return `${(px / 720) * width}vp`; // 以720px为基准
}
@Component
struct ProductDetail {
@State product: Product = { /* 商品数据 */ };
build() {
Column() {
// 顶部图片轮播
Swiper() {
ForEach(this.product.images, (img) => {
Image(img.url).width("100%").height(300).objectFit(ImageFit.Cover);
})
}
.height(300)
.marginBottom(16)
// 商品信息区域
Row() {
Column() {
Text(this.product.name).fontSize(24).fontWeight(Bold);
Text(`¥${this.product.price}`).fontSize(20).fontColor(Color.Red);
}
.flexGrow(1)
Button("加入购物车")
.width(120)
.height(40)
.backgroundColor(Color.Primary)
.fontColor(Color.White)
}
.padding(16)
.borderBottom({ width: 1, color: "#EEE" })
// 详情描述
Text("商品详情")
.fontSize(18)
.fontWeight(500)
.margin(16, 0)
Text(this.product.description)
.fontSize(16)
.lineHeight(24)
.marginHorizontal(16)
.maxLines(5)
.ellipsis()
}
.width("100%")
.height("100%")
.backgroundColor(Color.White)
}
}
// 商品数据结构
interface Product {
id: string;
name: string;
price: number;
images: string[];
description: string;
}
// 为父容器设置明确尺寸
Column {
// 子组件
}.width("100%").height(400); // 关键代码
// 同时设置justifyContent(垂直)和alignItems(水平)
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
// 子组件
}.width("100%").height("100%");
Image($r("image"))
.width(200)
.height(200)
.objectFit(ImageFit.Contain); // 保持宽高比,内容包含在容器内
组件复用策略
ButtonGroup.ets
、CardComponent.ets
)@Builder
定义可复用的UI片段:@Builder
CommonButton(text: string, onClick: () => void) {
Button(text)
.fontSize(16)
.padding(12, 24)
.backgroundColor(Color.Secondary)
.onClick(onClick)
}
响应式设计原则
MediaQuery
获取设备信息:import { MediaQuery } from '@ohos.multimodalinput';
let deviceWidth = MediaQuery.get('width'); // 获取当前设备宽度
性能优化技巧
cache
修饰符缓存布局计算build
函数中执行复杂逻辑,改用状态驱动UI更新通过本文的学习,我们掌握了鸿蒙UI开发的核心组件用法和布局技巧,了解了如何通过弹性布局和断点系统实现跨设备适配。下一篇文章将深入探讨鸿蒙动画实现,讲解如何通过声明式语法创建流畅的交互动画效果。建议开发者在实际项目中建立自己的组件库,遵循响应式设计规范,以提升开发效率和用户体验。