🌟【鸿蒙开发实战进阶】六大核心案例深度拆解,带你玩转多端适配!
📐 案例4:动态网格布局(电商商品列表)
应用场景:手机/平板商品展示差异
痛点分析:手机单列→平板多列,需智能计算展示数量
@Component struct GoodsGrid { @StorageLink('currentWidthBreakpoint') bp: string build() { Grid() { ForEach(goodsList, (item) => { GridItem() { GoodsItem(item) // 商品卡片组件 } }) } .columnsTemplate(this.getColumnsTemplate()) .rowsTemplate(this.getRowsTemplate()) } // 动态列数计算 private getColumnsTemplate(): string { switch(this.bp) { case 'sm': return '1fr'; // 手机单列 case 'md': return '1fr 1fr'; // 折叠屏双列 case 'lg': return '1fr 1fr 1fr'; // 平板三列 default: return '1fr'; } } // 动态行间距 private getRowsTemplate(): string { return this.bp === 'sm' ? '56vp' : '72vp'; // 大屏加大间距 } }
效果对比:
- 手机(sm):瀑布流单列,间距紧凑
- 折叠屏(md):双列平铺,图片自适应
- 平板(lg):三列展示,附加商品参数
🖥️ 案例5:自适应导航栏(跨设备菜单)
应用场景:Pad横屏显示侧边栏,手机隐藏为汉堡菜单
关键技术:@Watch监听 + 条件渲染
@Entry struct MainPage { @State isCollapsed: boolean = false @StorageLink('currentWidthBreakpoint') bp: string // 断点变化自动触发 @Watch('bp') onBpChange() { this.isCollapsed = this.bp === 'sm'; // 小屏自动折叠 } build() { Row() { // 侧边栏(大屏显示) if(!this.isCollapsed) { Column() { MenuItems() // 导航菜单组件 } .width(240) .backgroundColor('#F5F5F5') } // 主内容区 Column() { Header({ showMenuBtn: this.isCollapsed // 小屏显示菜单按钮 }) Content() } } } }
交互逻辑:
- 宽度≥840vp(lg):固定左侧240vp导航栏
- 320vp≤宽度<840vp(md):折叠为浮动侧边栏
- 宽度<320vp(xs):隐藏导航,顶部显示汉堡菜单
📖 案例6:阅读器分栏模式(文档类APP)
特殊需求:折叠屏半开状态特殊布局
核心代码:
@Component struct ReaderLayout { @StorageLink('currentHeightBreakpoint') hBp: string build() { Flex({ direction: FlexDirection.Row }) { // 左侧目录(高宽比>1.2时显示) if(this.hBp === 'lg') { Column() { ChapterList() // 目录组件 } .width('30%') } // 主阅读区域 Scroll() { TextContent() // 文本组件 } .flexGrow(1) // 右侧笔记(方正屏显示) if(this.hBp === 'md') { Column() { NotesPanel() // 笔记面板 } .width(280) } } } }
设备适配:
- 手机竖屏(hBp=lg):单栏阅读,底部浮窗目录
- 折叠屏半开(hBp=md):正文+右侧笔记双栏
- 平板横屏(hBp=sm):三栏显示(目录+正文+批注)
🎥 案例7:视频播放器多形态适配
复杂场景:全屏/分屏/画中画模式
关键技术点:窗口状态监听 + 动态样式
@Component struct VideoPlayer { @StorageLink('currentWidthBreakpoint') bp: string @State isFullscreen: boolean = false build() { Stack() { VideoComponent() // 核心播放器 .aspectRatio(this.getVideoRatio()) // 动态比例 // 全屏模式控件 if(this.isFullscreen) { FullscreenControls() } } .onClick(() => { if(this.bp === 'sm') { // 小屏单击切换全屏 this.toggleFullscreen(); } }) } // 根据断点设置视频比例 private getVideoRatio(): number { switch(this.bp) { case 'sm': return 16/9; // 手机保持16:9 case 'md': return 21/9; // 折叠屏超宽比例 case 'lg': return this.isFullscreen ? 16/9 : 4/3; // 平板适配 default: return 16/9; } } private toggleFullscreen() { // 全屏逻辑(略) } }
关键适配策略:
- 手机竖屏:默认16:9,单击全屏
- 折叠屏展开:21:9影院比例
- 平板分屏:4:3适合多任务布局
📊 案例8:数据看板动态布局
业务需求:从智能手表到智慧屏的多端数据可视化
代码片段:
@Entry struct Dashboard { @StorageLink('currentWidthBreakpoint') bp: string build() { GridRow({ columns: this.getGridColumns() }) { GridCol({ span: { xs:12, sm:6, md:4, lg:3 } }) { DataCard('销售额', '¥1,234万') // 数据卡片 } GridCol({ span: { xs:12, sm:6, md:8, lg:6 } }) { ChartComponent() // 可视化图表 } } } private getGridColumns(): number | GridRowColumnOption { return { xs: 4, // 手表4列(每列80vp) sm: 8, // 手机8列 md: 12, // 折叠屏12列 lg: 24 // 大屏精细布局 } } }
布局策略:
- 手表(xs):关键指标单列堆叠
- 手机(sm):左右分块显示
- 智慧屏(lg):24列精细排版,多图表联动
🛠️ 案例9:表单布局自动优化
典型场景:登录界面横竖屏适配
创新方案:使用栅格+弹性布局混合
@Component struct LoginForm { @StorageLink('currentHeightBreakpoint') hBp: string build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center }) { Image($r('app.media.logo')) .height(this.hBp === 'sm' ? 80 : 120) // 横屏缩小Logo FormLayout() { TextInput().placeholder('账号') TextInput().placeholder('密码') } .layoutType(this.hBp === 'sm' ? LayoutType.Grid : LayoutType.List) Button('登录') .width(this.hBp === 'sm' ? '60%' : '40%') } .padding(this.getFormPadding()) } private getFormPadding(): Padding { return { top: this.hBp === 'lg' ? 40 : 20, // 竖屏增加顶部间距 bottom: 20, left: this.hBp === 'sm' ? 10 : 30, // 横屏紧凑布局 right: this.hBp === 'sm' ? 10 : 30 } } }
布局变化:
- 竖屏(hBp=lg):列表式排列,大间距
- 横屏(hBp=sm):栅格紧凑布局,自适应宽度
💡 开发者锦囊(避坑指南)
- 断点覆盖策略
// 错误示范:遗漏断点区间 if(bp === 'sm') {...} else {...} // 正确做法:全覆盖判断 switch(bp) { case 'xs':... case 'sm':... case 'md':... case 'lg':... default:... }
- 单位选择黄金法则
- 文字:
fp
(字体像素,自动适应系统缩放) - 布局:
vp
(虚拟像素,屏幕密度无关) - 媒体资源:
px
(物理像素,确保清晰度)
- 多设备调试技巧
# 命令行同时启动多设备 hdc shell snapshot_demo -s 1080x2340 -d "Phone" hdc shell snapshot_demo -s 2200x2480 -d "Foldable"
🌐 终极适配方案架构
├── resources │ ├── breakpoints │ │ ├── phone.ets # 手机专属布局 │ │ ├── tablet.ets # 平板布局策略 │ │ └── foldable.ets # 折叠屏适配 ├── utils │ ├── BreakpointManager.ets # 断点状态管理 │ └── LayoutCalculator.ets # 动态布局计算 └── components ├── AdaptiveContainer.ets # 自适应容器 └── ResponsiveImage.ets # 响应式图片组件
掌握这些案例后,相信大家在面对复杂的多端适配需求时,能像搭积木一样灵活组合这些模式。如果遇到特别棘手的适配问题,欢迎在评论区留言,我们一起探讨解决方案! 🚀