写点什么

鸿蒙 5 开发宝藏案例分享 --- 一多断点开发实践

作者:莓创技术
  • 2025-05-29
    广东
  • 本文字数:2843 字

    阅读完需:约 9 分钟

🌟【鸿蒙开发实战进阶】六大核心案例深度拆解,带你玩转多端适配!


📐 案例 4:动态网格布局(电商商品列表)应用场景:手机/平板商品展示差异痛点分析:手机单列→平板多列,需智能计算展示数量 @Componentstruct 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 监听 + 条件渲染 @Entrystruct 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)特殊需求:折叠屏半开状态特殊布局核心代码:@Componentstruct 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:视频播放器多形态适配复杂场景:全屏/分屏/画中画模式关键技术点:窗口状态监听 + 动态样式 @Componentstruct 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:9case 'md': return 21/9; // 折叠屏超宽比例 case 'lg': return this.isFullscreen ? 16/9 : 4/3; // 平板适配 default: return 16/9;}}


private toggleFullscreen() {// 全屏逻辑(略)}}关键适配策略:


  1. 手机竖屏:默认 16:9,单击全屏

  2. 折叠屏展开:21:9 影院比例

  3. 平板分屏:4:3 适合多任务布局


📊 案例 8:数据看板动态布局业务需求:从智能手表到智慧屏的多端数据可视化代码片段:@Entrystruct 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:表单布局自动优化典型场景:登录界面横竖屏适配创新方案:使用栅格+弹性布局混合 @Componentstruct 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):栅格紧凑布局,自适应宽度


💡 开发者锦囊(避坑指南)


  1. 断点覆盖策略// 错误示范:遗漏断点区间 if(bp === 'sm') {...}else {...}


// 正确做法:全覆盖判断 switch(bp) {case 'xs':...case 'sm':...case 'md':...case 'lg':...default:...}


  1. 单位选择黄金法则● 文字:fp(字体像素,自动适应系统缩放)● 布局:vp(虚拟像素,屏幕密度无关)● 媒体资源:px(物理像素,确保清晰度)

  2. 多设备调试技巧

命令行同时启动多设备

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 # 响应式图片组件掌握这些案例后,相信大家在面对复杂的多端适配需求时,能像搭积木一样灵活组合这些模式。如果遇到特别棘手的适配问题,欢迎在评论区留言,我们一起探讨解决方案! 🚀

用户头像

莓创技术

关注

一只会打代码的羊 2020-03-20 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙5开发宝藏案例分享---一多断点开发实践_莓创技术_InfoQ写作社区