写点什么

HarmonyOS Next《ArkUI 常用基本组件指南 | 从布局到交互一站式精通》

作者:Turing_010
  • 2025-06-07
    广东
  • 本文字数:5775 字

    阅读完需:约 19 分钟

HarmonyOS Next《ArkUI常用基本组件指南 | 从布局到交互一站式精通》

##Harmony OS Next ##Ark Ts ##教育本文适用于教育科普行业进行学习,有错误之处请指出我会修改。


🌼ArkUI 布局超全指南 | 看完秒变排版大师!



🌟布局到底是什么?

就像搭积木一样🗿,组件按照特定规则排列组合就形成了页面!在 ArkUI 中,所有页面都是通过自定义组件+布局魔法搭建的~


开发四步曲🎻:1️⃣ ​​画框架​​:先想好页面长啥样(比如顶部导航+中间内容+底部 Tab)2️⃣ ​​拆零件​​:分析要放哪些元素(按钮?图片?列表?)3️⃣ ​​选容器​​:用 Column 纵向堆叠,Row 横向排列,Stack 叠叠乐...4️⃣ ​​调细节​​:控制每个元素的位置和大小



🎨布局元素解剖课

🔵 ​​蓝区​​:组件的"地盘" → 用width/height设定🟡 ​​黄区​​:实际可用空间 = 蓝区 - border 值🟢 ​​绿区​​:内容真实大小(比如文字自动撑开)⚫ ​​虚线区​​:组件+margin 的势力范围


对齐小技巧✨:当内容比黄区小时 → 用align玩对齐魔术(居中/靠左/靠右)



🚀10 大布局神器速查表



🎯定位黑科技

// 绝对定位:爸爸的左上角是原点Component1().position({x: 20, y: 30})
// 相对定位:从自己原来的位置漂移Component2().offset({x: 5, y: -10})
复制代码


🚨避坑指南:绝对定位在适配不同屏幕时容易翻车,建议多用相对布局!



🧩子元素控制三大绝招



💡超实用小贴士

  1. 百分比布局width('50%')超方便,但要注意父容器有没有设置尺寸!

  2. 布局权重:用layoutWeight让元素自动吃满剩余空间

  3. 媒体查询:不同设备用不同布局,代码示例:


// 手机竖屏显示Column,横屏变Rowif (mediaQuery.matchDevice({orientation: 'portrait'})) {  buildColumnLayout()} else {  buildRowLayout()}
复制代码


🎉记住啦! 好的布局 = 选对容器 + 灵活运用定位属性 ~ 现在就去 ArkUI 里大显身手吧!


🚀ArkUI 图片全攻略 | 一文学会花式玩图技巧



🌈Image 组件初体验

想让你的 APP 颜值飙升?Image 组件就是你的美图秀秀!支持 PNG/JPG/SVG 等格式,轻松实现:✅ 本地图片 ✅ 网络图片 ✅ 矢量图标 ✅ 动态 GIF


// 基础用法三连击!Image($r('app.media.logo')) // 资源图片Image('images/avatar.jpg')   // 本地图片Image('https://example.com/banner.png') // 网络图片
复制代码



📥六种图片加载姿势


🛑网络图片必看:


  1. 需要申请网络权限 ohos.permission.INTERNET

  2. 首次加载会请求网络,后续自动读缓存

  3. 复杂场景推荐使用 ImageKnife



🎯媒体库图片实战

三步 get 用户相册美图:


// 1. 引入媒体库模块import { photoAccessHelper } from '@kit.MediaLibraryKit';
// 2. 创建图片选择器let picker = new photoAccessHelper.PhotoViewPicker();picker.select({ MIMEType: 'IMAGE_TYPE', maxSelectNumber: 5 }).then(result => { // 3. 获取选中图片URI this.imgUrls = result.photoUris; })
// 在Grid中展示Grid() { ForEach(this.imgUrls, (uri) => { GridItem() { Image(uri).width(200).height(200) } })}
复制代码



🔮矢量图魔法时间

SVG 图标随心变色!


Image($r('app.media.cloud'))  .width(50)  .fillColor(Color.Blue) // 一键换色!
复制代码


💡嵌套位图技巧:


// 工程目录结构ets/  images/    icon.svg    sky.png 
// SVG文件内引用<svg> <image xlink:href="sky.png"></image></svg>
复制代码



⚙️图片属性调教指南

📐缩放模式大比拼

// 六种objectFit效果演示Image($r('app.media.pic'))  .objectFit(ImageFit.Contain)  // 等比例完整显示  .objectFit(ImageFit.Cover)    // 填满容器并裁剪  .objectFit(ImageFit.Fill)     // 拉伸变形填满
复制代码

🖼️重复平铺特效

// 四种重复模式Image($r('app.media.pattern'))  .objectRepeat(ImageRepeat.XY)  // 双向平铺  .objectRepeat(ImageRepeat.X)   // 横向平铺
复制代码

🎨滤镜调色板

// 添加复古滤镜Image($r('app.media.photo'))  .colorFilter([    0.393, 0.769, 0.189, 0, 0,    0.349, 0.686, 0.168, 0, 0,    0.272, 0.534, 0.131, 0, 0,    0,     0,     0,     1, 0  ])
复制代码



性能优化秘籍

  1. 解码尺寸控制 - 降低分辨率


Image($r('app.media.high_res'))  .sourceSize({ width: 100, height: 100 }) // 强制解码为100x100
复制代码


  1. 插值抗锯齿 - 放大不模糊


Image($r('app.media.low_res'))  .interpolation(ImageInterpolation.High) // 高质量插值
复制代码


  1. 同步加载 - 防闪烁(慎用!)


Image($r('app.media.banner'))  .syncLoad(true)  // 可能阻塞UI!
复制代码



🔔事件监听小助手

Image($r('app.media.dynamic'))  .onComplete((msg) => { // 加载成功回调    console.log(`图片尺寸:${msg.width}x${msg.height}`)  })  .onError(() => { // 加载失败处理    console.log('图片加载失败啦!')  })
复制代码




🎉终极 Tips:


  • 网络图片记得处理加载状态(占位图+错误提示)

  • SVG 图标优先选择,适配不同分辨率屏幕

  • 大图建议使用缩略图+点击查看原图方案

  • 定期清理图片缓存防止 OOM


现在就去用 Image 组件打造你的视觉盛宴吧!🚀


📚ArkUI 文本全解 | Text 和 Span 的魔法手册



🎨文本创建三连击

方式一:直接字符串


Text('我是人见人爱的文本宝宝~') 
复制代码


方式二:资源引用


// 在string.json定义资源Text($r('app.string.welcome'))   .fontSize(30)  .border({ width: 1 })
复制代码


彩蛋玩法:✅ 支持多语言资源✅ 自动适配系统字体大小✅ 跨模块复用文本资源



👯Text 和 Span 的共舞


CP 组合技演示


Text('主文本') {  Span('红色删除线').decoration({     type: TextDecorationType.LineThrough,     color: Color.Red   })  Span('蓝色下划线').decoration({    type: TextDecorationType.Underline,    color: Color.Blue  })}.borderWidth(1)
复制代码


%E9%93%BE%E6%8E%A5%E5%8D%A0%E4%BD%8D%E7%AC%A6



文本样式美容院

📐对齐与溢出

// 三种对齐方式Text('左对齐').textAlign(TextAlign.Start)  Text('居中').textAlign(TextAlign.Center)Text('右对齐').textAlign(TextAlign.End)
// 超长文本处理Text('很长很长的内容...') .maxLines(1) .textOverflow({overflow: TextOverflow.Ellipsis}) // 显示...
复制代码

🎭文字变形术

Text('Hello World')  .textCase(TextCase.UpperCase) // 全大写  .letterSpacing(5)            // 字间距  .baselineOffset(10)          // 基线偏移
复制代码

🌈动态字号

// 自适应字号(根据容器大小)Text('智能缩放文字')  .maxFontSize(30)  .minFontSize(12)  .height(50)  .width(200)
复制代码



交互与事件

🖱️点击响应

Text('点我有惊喜!')  .onClick(() => {    console.log('文本被点击啦!')  })
Text() { Span('可点击Span') .onClick(() => { console.log('Span被戳中~') })}
复制代码


⚠️注意


  • Span 仅支持点击事件

  • Text 支持所有通用事件(onTouch/onLongPress 等)



🎩高级特效秀

📜滚动字幕

Text('紧急通知:ArkUI 3.0发布啦!')  .textOverflow({overflow: TextOverflow.Marquee})  .maxLines(1)
复制代码

📋复制粘贴

Text("长按复制我")  .copyOption(CopyOptions.InApp) // 允许应用内复制
复制代码

🖌️文字阴影

Text('立体文字')  .textShadow({    radius: 5,    color: Color.Grey,    offsetX: 2,    offsetY: 2  })
复制代码



💡最佳实践 Tips

  1. 性能优化


  • 避免在滚动视图中使用复杂 Span 嵌套

  • 长文本优先使用 Ellipsis 代替 Marquee


  1. 国际化


// 使用资源引用适配多语言Text($r('app.string.greeting'))
复制代码


  1. 无障碍


Text('重要提示')  .accessibilityDescription('这是关于系统更新的重要通知')
复制代码


  1. 样式复用


// 使用@Styles定义通用样式@Styles function boldRed() {  .fontColor(Color.Red)  .fontWeight(FontWeight.Bold)}
Text('重点内容').boldRed()
复制代码


🎉现在就去用 Text 和 Span 打造你的文字艺术馆吧!


🚀ArkUI 输入框终极指南 | TextInput & TextArea 全掌握



📱输入框双雄登场

TextInput - 单行输入小王子​​TextArea​​ - 多行文本大管家


// 基础创建姿势TextInput()  // 单行输入TextArea()   // 多行输入(自动换行)
// 带预设文本TextArea({ text: "我是超长文本..." }).width(300)
复制代码



🔧九大输入类型任你选



🎨个性化装扮指南

📝基础装扮三件套

TextInput({   placeholder: '请输入用户名',  // 提示文字  text: '默认内容'             // 预设文本}).backgroundColor(Color.Pink)  // 粉嫩背景.fontColor(Color.Black)        // 文字颜色
复制代码

🖌️高级样式魔法

✅ 边框定制✅ 圆角效果✅ 字体大小调整✅ 输入框尺寸控制


TextInput()  .width('90%')  .height(50)  .border({     width: 2,     color: Color.Blue,    radius: 10   })
复制代码



事件监听大师课

TextInput()  // 内容变化实时监听  .onChange((value: string) => {    console.log(`输入内容:${value}`);  })  // 聚焦/失焦监听  .onFocus(() => console.log('获得焦点'))  .onBlur(() => console.log('失去焦点'))  // 回车键响应  .onSubmit((keyType) => {    console.log(`回车类型:${keyType}`);  })
复制代码



📱登录页面实战

@Entry@Componentstruct LoginPage {  build() {    Column() {      TextInput({ placeholder: '账号' })        .margin(20)        .type(InputType.USER_NAME)
TextInput({ placeholder: '密码' }) .margin(20) .type(InputType.PASSWORD)
Button('登录', { type: ButtonType.Capsule }) .width(200) .margin(20) } .padding(20) }}
复制代码



🛡️键盘避让黑科技

为什么需要?手机键盘弹出时可能遮挡输入框!


解决方案:用 Scroll/List/Grid 包裹输入容器


@Entry@Componentstruct ChatPage {  build() {    Scroll() {  // 关键包裹层!      Column() {        ForEach(消息列表, (消息) => {          TextArea({ text: 消息内容 })            .margin(10)        })      }    }    .height('100%')  }}
复制代码



💡超实用技巧合集

  1. 智能字号调整


TextInput()  .maxFontSize(20)  .minFontSize(12)  // 根据容器自动缩放
复制代码


  1. 禁止复制粘贴


TextInput()  .copyOption(CopyOptions.None)
复制代码


  1. 输入长度限制


TextInput()  .maxLength(10)  // 最多输入10字符
复制代码


  1. 光标控制


const controller = new TextInputController()TextInput({ controller })  .onClick(() => {    controller.caretPosition(5)  // 光标定位到第5位  })
复制代码



🚨避坑指南

⚠️ 多行输入避免使用 height 固定高度 → 用 maxLines 控制⚠️ 密码输入记得搭配.type(InputType.Password)⚠️ 表单提交前务必做输入校验




🎉现在就去打造你的智能输入界面吧! 记得多用 Scroll 解决键盘遮挡问题哦~ 🚀


🚀ArkUI 按钮全攻略 | 玩转交互设计就靠它!



🛠️按钮创建双模式

模式一:文字按钮


// 基础文字按钮Button('确认', {   type: ButtonType.Normal,   stateEffect: true  // 开启点击动效}).borderRadius(8).backgroundColor(0x317aff).width(90).height(40)
复制代码


模式二:图文混合按钮


// 图标+文字组合按钮Button({ type: ButtonType.Capsule }) {  Row() {    Image($r('app.media.ic_star'))      .width(20).height(20).margin({ left: 10 })    Text('收藏').fontSize(12).margin({ left: 5, right: 10 })  }.alignItems(VerticalAlign.Center)}.backgroundColor(Color.Blue).width(120)
复制代码



🎨按钮类型三剑客


示例对比


// 胶囊按钮(自动圆角)Button('删除', { type: ButtonType.Capsule })  .width(100).height(40)
// 圆形按钮(固定圆形)Button('+', { type: ButtonType.Circle }) .width(60).height(60)
// 普通按钮(自定义圆角)Button('分享', { type: ButtonType.Normal }) .borderRadius(20)
复制代码



样式美容院

🎩百变造型

// 渐变背景按钮Button('VIP专属')  .linearGradient({    angle: 90,    colors: [[0xffd700, 0], [0xff4500, 1]]  })
// 边框发光按钮 Button('新消息') .border({ width: 2, color: Color.White, style: BorderStyle.Dotted }) .shadow({ radius: 10, color: Color.Blue })
复制代码

🖼️图标功能按钮

// 删除按钮Button({ type: ButtonType.Circle }) {  Image($r('app.media.ic_delete'))    .width(30).height(30)}.width(50).height(50).backgroundColor(Color.Red)
复制代码



点击魔法

基础点击事件


Button('立即购买')  .onClick(() => {    console.log('商品加入购物车')    // 这里调用支付接口  })
复制代码


防重复点击


let isProcessing = false
Button('提交订单') .onClick(() => { if (isProcessing) return isProcessing = true // 执行提交逻辑 setTimeout(() => { isProcessing = false }, 1000) })
复制代码



🚀实战演练室

📱页面导航按钮

// 跳转到设置页Button('设置')  .onClick(() => {    router.pushUrl({ url: 'pages/Settings' })  })
复制代码

🔐登录注册按钮

Column() {  TextInput({ placeholder: '手机号' })  TextInput({ placeholder: '密码' }).type(InputType.Password)  Button('注册', { type: ButtonType.Capsule })    .width('80%')    .onClick(() => {      // 调用注册API    })}
复制代码

🎯悬浮动作按钮

Stack() {  List() { /* 长列表内容 */ }    Button({ type: ButtonType.Circle }) {    Image($r('app.media.ic_add'))      .width(40).height(40)  }  .width(60).height(60)  .position({ x: '85%', y: '80%' })  .shadow({ radius: 10 })  .onClick(() => {    // 弹出新建内容浮层  })}
复制代码



💡超实用技巧

  1. 禁用状态


Button('已售罄')  .enabled(false)  // 禁用点击  .opacity(0.6)    // 透明度变化
复制代码


  1. 加载中状态


Button({ type: ButtonType.Normal }) {  LoadingProgress().width(20).height(20)  Text('加载中...').margin({ left: 8 })}
复制代码


  1. 长按菜单


Button('长按复制')  .onLongPress(() => {    clipboard.copy('复制的内容')  })
复制代码


  1. 按键反馈


Button('震动反馈')  .onTouch((event) => {    if (event.type === TouchType.Down) {      vibrator.vibrate(50)  // 按下时震动50ms    }  })
复制代码



🚨避坑指南

⚠️ 胶囊按钮不要设置 borderRadius(无效)⚠️ 图文按钮确保子组件不超过一个⚠️ 悬浮按钮需用 Stack 布局防止滚动遮挡⚠️ 提交按钮务必做防重复点击处理




🎉现在就去用 Button 点亮你的交互设计吧! 记得多用不同样式区分主要/次要操作哦~ 🚀

用户头像

Turing_010

关注

还未添加个人签名 2025-05-22 加入

还未添加个人简介

评论

发布
暂无评论
HarmonyOS Next《ArkUI常用基本组件指南 | 从布局到交互一站式精通》_Turing_010_InfoQ写作社区