Harmony OS Next《ArkUI组件指南 | 布局一站精通》
【摘要】 ##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 |
💡超实用小贴士
- 百分比布局:
width('50%')
超方便,但要注意父容器有没有设置尺寸! - 布局权重:用
layoutWeight
让元素自动吃满剩余空间 - 媒体查询:不同设备用不同布局,代码示例:
// 手机竖屏显示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对象) |
🛑网络图片必看:
- 需要申请网络权限
ohos.permission.INTERNET
- 首次加载会请求网络,后续自动读缓存
- 复杂场景推荐使用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
])
⚡性能优化秘籍
- 解码尺寸控制 - 降低分辨率
Image($r('app.media.high_res'))
.sourceSize({ width: 100, height: 100 }) // 强制解码为100x100
- 插值抗锯齿 - 放大不模糊
Image($r('app.media.low_res'))
.interpolation(ImageInterpolation.High) // 高质量插值
- 同步加载 - 防闪烁(慎用!)
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)