【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案

【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案

一、前言

在这里插入图片描述

目前应用上架华为AGC平台,都会被要求适配折叠屏设备。目前华为系列的折叠屏手机,有华为 Mate系列(左右折叠,华为 Mate XT三折叠),华为Pocket 系列(上下折叠)。

二、适配方案思路探讨

目前鸿蒙应用适配折叠屏的思路分为两种:分栏和全屏适配。

在这里插入图片描述
在这里插入图片描述

分栏
在左右折叠手机上,相当于首页一级页面在左边,二级子页面点开后在右边。三折叠上形态未知,有知道的小伙伴可以同步下。
上下折叠手机上,不以分栏的方式呈现,和直板机相似。

单栏(全屏)

全屏适配并且拉伸界面,不进行界面处理。而是处理成平板的UI布局形式,和直板机界面排版不一样。这种适配方案效果最好,但是工作量较大。

不过目前华为官方反馈说以后不演进分栏方案了。三折叠和25年三月新形态手机的适配都是风险。

三、适配方案实现

传统的router路由在折叠屏适配上,无法提供良好支撑。所以建议切换到Navigation。

因为不管是路由回退栈的处理,还是页面数的限制问题。Navigation都优于router,并且华为官方已经明确表示,推荐Navgation的方案。

当然如果有了解HMRouter的同学,也可以使用,因为HMRouter就是在Navgation上进行封装和优化的三方库。

分栏
设置主页面容器Navigation,mode属性为NavigationMode.Stack:



struct MainPage {
   message: string = 'Hello World';
  // 创建一个页面栈对象并传入Navigation
  pageStack: NavPathStack = new NavPathStack()

  build() {
    Navigation(this.pageStack) {
      // 页面布局
      Row() {
        Column() {
          Text(this.message)
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
            .onClick(()=>{
              // 跳转到子页面
              this.pageStack.pushDestination({
                name: "OnePage",
              }, false); //该false表示不需要转场动画,默认是有的
            })
        }
        .width('100%')
      }
      .height('100%')
    }
    .mode(NavigationMode.Split)

  }
}

细节可参考该文章,点击跳转=》(【HarmonyOS】关于官方推荐的组件级路由Navigation的心得体会)


单栏(全屏)
设置主页面容器Navigation,mode属性为NavigationMode.Stack:



struct MainPage {
   message: string = 'Hello World';
  // 创建一个页面栈对象并传入Navigation
  pageStack: NavPathStack = new NavPathStack()
    // 使用 @State 装饰器定义响应式变量,用于存储组件的宽高
   width: number = 0
   height: number = 0

  build() {
    Navigation(this.pageStack) {
      // 页面布局
      Row() {
        Column() {
          Text(this.message)
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
            .onClick(()=>{
              // 跳转到子页面
              this.pageStack.pushDestination({
                name: "OnePage",
              }, false); //该false表示不需要转场动画,默认是有的
            })
        }
        .width('100%')
      }
      .height('100%')
    }
    // 分为三种模式,(默认)自动NavigationMode.Auto,单页面NavigationMode.Stack和分栏NavigationMode.Split
    .mode(NavigationMode.Stack)
    .backgroundColor(Color.Gray)
     .onSizeChange((width: number, height: number) => {
          // 当组件大小变化时,更新宽高信息
          this.width = width
          this.height = height
        })
        .onAreaChange( (oldValue: Area, newValue: Area)=>{
          // newValue.width
      })
  }
}

界面需要监听最外层宽高,onSizeChange和onAreaChange都可以,建议使用onAreaChange,用于判定界面是否需要切换为平板适配模式。【目前官方推荐使用600vp 作为当页面宽度大于等于一定阈值点】

子页面添加跳转入口函数,添加NavDestination生命周期的处理:

// 跳转页面入口函数

export function OnePageBuilder() {
  OnePage()
}



struct OnePage {
  private TAG: string = "OnePage";
   message: string = 'Hello World';
  pathStack: NavPathStack = new NavPathStack();

  build() {
    NavDestination() {
      Row() {
        Column() {
          Text(this.message)
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
        }
        .width('100%')
      }
      .height('100%')
    }.onShown(()=>{
      console.log(this.TAG, "OnePage onShown");
    })
     .onReady((context: NavDestinationContext) => {
         this.pathStack = context.pathStack;
    })
  }
}

在首页获取到的宽高,可以使用多种方式缓存起来,例如放到AppStorage,单例中。二级等子页面进入后就可以判定。

当然页面中的动态监听也需要保存。场景需要覆盖,因为在首页时用户可能是折叠状态,进入子页面后展开的情况也有。

当然判定手机折叠屏状态,除了通过宽高,也可通过官方提供的折叠屏状态进行判断,不过在上下折叠屏手机上也会被激活,这里需要额外在判定一下。

import { display } from '@kit.ArkUI';

let ret: boolean = false;
// 当前是否是折叠屏
ret = display.isFoldable();

if(ret){
let callback: Callback<display.FoldStatus> = (data: display.FoldStatus) => {
  console.info('Listening enabled. Data: ' + JSON.stringify(data));
};
display.on('foldStatusChange', callback);
}


// 页面销毁时,记得取消监听
display.off('foldStatusChange', callback);

在这里插入图片描述

### 鸿蒙 OS 折叠屏设备页面布局适配方法 对于鸿蒙操作系统中的折叠屏设备,为了确保应用程序能够在不同屏幕尺寸下提供一致且优化的用户体验,开发者需特别关注页面布局的设计与调整。针对汽车应用界面开发,重点在于利用鸿蒙系统的特性来创建响应式的用户界面。 #### 动态多窗布局支持 在设计适用于折叠屏车辆控制面板的应用程序时,应考虑启用水平方向上的多窗口模式。这可以通过调用特定API实现,即`enableLandscapeMultiWindow()`函数用于激活该功能,而`disableLandscapeMultiWindow()`则用来关闭它[^2]。此设置尤其适合于多媒体播放器或其他需要较大显示区域的内容展示型应用。 #### 自适应UI框架 采用自适应UI框架可以有效简化跨多种终端类型的兼容性工作。当检测到当前运行环境为大屏或双屏状态时,自动切换至更适合此类场景下的视觉呈现方式。例如,在单屏状态下可能采取竖直排列菜单项;而在展开后的宽幅屏幕上,则转换成更直观的操作卡片形式分布各功能模块。 #### 组件级转场动画增强交互体验 除了整体架构层面的变化外,局部细节之处也不容忽视。借助ArkTS所提供的声明式编程模型,能够轻松定义并实施流畅自然的画面过渡效果。无论是从列表视图跳转详情页还是返回上级目录,恰当运用这些微动效都能显著提高用户的操作舒适度和效率[^4]。 ```typescript // 示例代码:使用 ArkTS 实现简单页面间转场动画 import router from '@ohos.router' function navigateToDetails() { const options = { transitionName: 'slideInRight' } router.push('/details', null, options) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值