Harmony OS Next《ArkUI组件指南 | 布局一站精通》

举报
Turing_010 发表于 2025/05/28 14:03:36 2025/05/28
176 0 0
【摘要】 ##Harmony OS Next ##Ark Ts ##教育本文适用于教育科普行业进行学习,有错误之处请指出我会修改。涵盖组件全家桶:✅ ​​布局容器​​(Flex/Stack/Grid)✅ ​​图片处理​​(Image/PixelMap/SVG)✅ ​​文本魔法​​(Text/Span)✅ ​​输入交互​​(TextInput/TextArea)✅ ​​按钮艺术​​(Capsule/Ci...

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

涵盖组件全家桶
✅ ​​布局容器​​(Flex/Stack/Grid)
✅ ​​图片处理​​(Image/PixelMap/SVG)
✅ ​​文本魔法​​(Text/Span)
✅ ​​输入交互​​(TextInput/TextArea)
✅ ​​按钮艺术​​(Capsule/Circle/Normal)

教程亮点
🎯 ​​零基础友好​​:分步图解+口语化讲解
🎨 ​​样式自由定制​​:边框/阴影/滤镜/动效全解锁
💡 ​​实战场景覆盖​​:登录页/相册/商品列表/悬浮按钮
🚀 ​​性能优化秘籍​​:图片缓存/键盘避让/防重复点击

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


🌟布局到底是什么?

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

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


🎨布局元素解剖课

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

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


🚀10大布局神器速查表

布局方式 使用场景 举个栗子🌰
Row/Column 需要直线排列时(超过1个元素) 商品横向排列栏
Stack 要做叠加效果(比如悬浮按钮) 图片上叠加收藏图标⭐
Flex 元素需要自动伸缩比例 三栏等分导航
RelativeContainer 复杂二维布局(拒绝套娃!) 头像+昵称+简介自由组合
Grid系列 需要响应式布局(不同设备自动适配) 手机/平板不同列数展示
List 超长滚动列表(聊天记录/商品列表) 朋友圈动态瀑布流
Swiper 轮播图/广告横幅 电商首页顶部Banner
Tabs 标签页切换(保持导航可见) 设置页的多个分类

🎯定位黑科技

// 绝对定位:爸爸的左上角是原点
Component1().position({x: 20, y: 30})

// 相对定位:从自己原来的位置漂移
Component2().offset({x: 5, y: -10})

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


🧩子元素控制三大绝招

效果 属性 使用场景 代码示例
拉伸 flexGrow/flexShrink 空间重新分配 Text('拉伸').flexGrow(1
缩放 aspectRatio 保持宽高比 Image().aspectRatio(1.5
隐藏 displayPriority 空间不足时智能隐藏 Button().displayPriority(2

💡超实用小贴士

  1. 百分比布局width('50%')超方便,但要注意父容器有没有设置尺寸!
  2. 布局权重:用layoutWeight让元素自动吃满剩余空间
  3. 媒体查询:不同设备用不同布局,代码示例:
// 手机竖屏显示Column,横屏变Row
if (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') // 网络图片

📥六种图片加载姿势

类型 使用场景 代码示例
本地图片 固定展示的图标/背景 Image('images/icon.png')
网络图片 动态更新的Banner/头像 Image('https://xxx.jpg')
资源引用 跨模块复用图片 Image($r('app.media.logo'))
媒体库 用户相册图片选择 Image('file://media/Photos/5')
Base64 小图内嵌(网页常用) Image('data:image/png;base64,...')
PixelMap 处理解码后的像素数据 Image(pixelMap对象)

🛑网络图片必看:

  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组件打造你的视觉盛宴吧!🚀

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。