写点什么

鸿蒙 5 开发宝藏案例分享 --- 三折叠应用开发分享

作者:莓创技术
  • 2025-06-17
    广东
  • 本文字数:1903 字

    阅读完需:约 6 分钟

鸿蒙三折叠应用开发宝藏分享:官方案例详解与实战代码

大家好呀!今天在翻鸿蒙文档时发现一个​​超级宝藏​​——官方提供的三折叠开发案例!之前总觉得多设备适配复杂,没想到 HarmonyOS 早就准备好了完善方案。话不多说,直接上干货,结合代码带大家玩转三折叠屏开发!



🚀 ​​三折叠的三种状态与断点适配​

三折叠手机(如 Mate XT)有​​三种核心状态​​,对应不同布局策略:


  1. ​单屏态(F 态)​​:直板机布局,断点 sm

  2. ​双屏态(M 态)​​:类似大折叠展开态,断点 md

  3. ​三屏态(G 态)​​:平板布局,断点 lg


​关键技巧​​:用​​断点(breakpoint)​​ 而非设备类型做布局判断,保证代码通用性:


// 根据断点切换Tabs位置(底部→侧边栏)@StorageLink('currentWidthBreakpoint') currentWidthBreakpoint: string = 'lg';
build() { Tabs({ barPosition: this.currentWidthBreakpoint === 'lg' ? BarPosition.Start : BarPosition.End // lg时侧边栏,其他态底部 }) { ... } .vertical(this.currentWidthBreakpoint === 'lg') // lg时纵向排列}
复制代码


📌 ​​为什么用断点?​

避免用 deviceType == 'tablet' 判断,三折叠 G 态和平板布局应一致,但设备类型不同!



🖼️ ​​典型布局场景实战​

场景 1:侧边导航栏(F 态→G 态动态迁移)

​效果​​:小屏时底部导航栏,大屏(≥840vp)变左侧导航栏。


​代码关键点​​:


// 1. 监听窗口变化(EntryAbility.ets)onWindowStageCreate(windowStage: window.WindowStage) {  windowStage.getMainWindow().then((win: window.Window) => {    win.on('windowSizeChange', (size: window.Size) => {      AppStorage.setOrCreate('windowWidth', size.width); // 存储窗口宽度    });  });}
// 2. 页面动态调整导航栏(Home.ets)@StorageProp('windowWidth') winWidth: number = 0;
build() { if (this.winWidth >= 840) { // 达到lg断点 Navigation() { SideBar() { ... } // 左侧导航 ContentArea() { ... } } } else { BottomTabs() { ... } // 底部导航 }}
复制代码



场景 2:瀑布流图片自适应列数

​问题​​:小屏显示 2 列,大屏显示 3 列并调整宽高比。


​代码解决方案​​:


// 根据断点设置WaterFlow列数@StorageLink('currentBreakpoint') breakpoint: string;
build() { WaterFlow() { ForEach(this.imageList, (item) => { Image(item.url) .aspectRatio(1.5) // 固定宽高比防变形 }) } .columnsTemplate(this.breakpoint === 'lg' ? '1fr 1fr 1fr' : '1fr 1fr' // lg时3列,其他2列 )}
复制代码



场景 3:轮播图大屏延展效果

​G 态专属​​:左右露出部分内容,增强视觉延展性。


​关键 API​​:prevMargin + nextMargin


Swiper() {  ForEach(this.bannerList, (item) => {    Image(item.url)  })}.displayCount(5) // G态显示5张图.prevMargin(40)  // 左侧露出40px.nextMargin(40)  // 右侧露出40px.itemSpace(10)    // 图片间距
复制代码



场景 4:悬停态相机(半折态特殊交互)

​效果​​:屏幕半折时触发悬停拍摄模式。


​代码重点​​:监听折叠状态 + 锁定横屏


// 监听折叠状态变化display.on('foldStatus', (status: display.FoldStatus) => {  if (status === display.FoldStatus.FOLD_STATUS_HALF_FOLDED) {    this.isHalfFolded = true; // 进入悬停态    window.getLastWindow().then(win => {      win.setPreferredOrientation(window.Orientation.LANDSCAPE); // 强制横屏    });  }});
// 悬停态专属UIbuild() { if (this.isHalfFolded) { SuspendedCameraView() // 悬停拍摄组件 }}
复制代码



⚠️ ​​避坑指南​

  1. ​旋转失效问题​

  2. ​错误做法​​:用折叠状态判断旋转(三折叠 G 态≠大折叠展开态)。

  3. ​正确方案​​:用窗口宽高比控制:


    // 根据宽高比设置相机预览区域    if (widthBp === 'md' && heightBp === 'md') {       surfaceRect = { width: winWidth, height: winWidth * 0.75 }; // 4:3比例    }
复制代码


  1. ​布局拉伸问题​

  2. ​必加属性​​:.aspectRatio() 保证图片/视频比例:


    GridItem() {      VideoPlayer().aspectRatio(16/9) // 强制16:9    }
复制代码



💎 ​​总结​

鸿蒙的三折叠适配方案核心可总结为:


✅ ​​断点驱动布局​​:sm/md/lg 覆盖所有状态


✅ ​​组件动态属性​​:Tabs/WaterFlow/Swiper 根据断点调整参数


✅ ​​特殊状态监听​​:悬停态通过foldStatus触发


搞折叠屏开发的朋友们,赶紧用起来吧!遇到问题欢迎在评论区讨论交流~ 下期分享更多鸿蒙隐藏技巧! ✨

用户头像

莓创技术

关注

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

还未添加个人简介

评论

发布
暂无评论
鸿蒙5开发宝藏案例分享---三折叠应用开发分享_莓创技术_InfoQ写作社区