【HarmonyOS NEXT】使用 Navigation 对折叠屏设备页面进行分栏展示,优化 UI 交互

关键词:折叠屏、navigation、router、路由、分栏、UI

随着科技的发展,手机设备形态也由一面屏向多面屏进行发展,那么软件的UI适配也面临着问题,本篇文章主要解决大屏设备的页面 UI 适配问题,如折叠屏,平板,若不想单独对页面 UI 进行大屏设备的响应式布局的开发,那么可使用官方提供的 navigation 跳转方式,对页面进行分栏展示,从而确保应用能给用户提供良好的 UI 交互,避免出现 “大号APP” 的问题。

本期文章以双折叠屏设备为例,使用 navigation 对页面进行动态分栏跳转及自定义 router 的封装与开发改造。需要注意的是,使用 Navigation 对折叠屏设备进行分栏模式适配后,基础单屏设备(标准屏)并不会出现分栏效果,跟 router 跳转无差异,所以可放心使用。

本期完整demo已提交至Gitee:columnDivision: 【HarmonyOS NEXT】使用 Navigation 对折叠屏设备页面进行分栏展示,优化 UI 交互

目录

效果演示

1. 使用 Navigation() 组件包裹首页面,绑定路由栈

2. 使用 Localstorage 存储路由栈

3. 使用 NavDestination() 组件包裹目标页面,创建页面构建函数

4. 创建 route_map.json 文件,并配置该文件

5. 自定义 router 封装

6. 使用封装的 router 跳转页面

效果演示

未使用 navigation

使用 navigation(展开与折叠状态)

1. 使用 Navigation() 组件包裹首页面,绑定路由栈

应用启动则会进入第一个页面,展示的第一个页面需要使用 Navigation() 对根容器进行包裹,并对其进行路由栈的绑定,后续跳转则需使用绑定的路由栈 pageInfos 进行跳转。

2. 使用 Localstorage 存储路由栈

在第一步中创建的 pageInfos 需要被应用共享去使用,我使用的是 Localstorage 方式去存取,也可使用 AppStorage 或单例等其他形式,根据自身业务与开发习惯跳转即可。

因为我使用的是 Localstorage 页面级状态存储的方式,若想被整个 stage 共享,那么需要在 ability 加载时就创建好 Localstorage 并在 loadContent 时传入第二个参数。

后续使用即可利用 getShared 获取当前 stage 共享的 localstorage,如:

// 设置 localstorage
LocalStorage.getShared().setOrCreate("NavPathStack", pageInfos)

// 获取 localstorage
LocalStorage.getShared().get("NavPathStack") as NavPathStack

3. 使用 NavDestination() 组件包裹目标页面,创建页面构建函数

使用 navigation 跳转页面,则需要对跳转的目标页面根容器进行改造,外层包裹 NavDestination 组件,并设置 onBackPressed() 回调,因为我们要实现动态的分栏效果,所以在返回手势触发时也需要进行路由栈的计算,详细可查看第 5 步。

组件改造后需要创建构建函数,函数中引入当前的页面组件并进行导出,此处也不可缺少,因为需要在配置文件中进行设置。

4. 创建 route_map.json 文件,并配置该文件

在鸿蒙应用开发过程中,页面跳转需要使用到 router ,并在 main_pages.json 中配置页面路由。同理,若想使用 navigation 进行跳转,也需要进行相关的路由配置,不过我们需要手动在 resources/base/profile 下创建 route_map.json 文件,在创建的文件中进行如下路由配置。

字段解释:

name:路由名称,后续跳转时需要使用该名称进行跳转

pageSourceFile:对应页面代码文件的路径

buildFunction:在前一步中改造后导出的构建函数 Builder 名称

创建完 route_map.json 并不能立即进行跳转,还需要在 module.json5 中生效该文件,在 module 对象下设置 routerMap 字段,值为 $profile:route_map ,代表刚才在 profile 中创建的 route_map 文件。

5. 自定义 router 封装

Navigation 存在默认分栏比例,折叠屏设备在 app 一启动即为分栏展示(右半屏白屏展示,左半屏展示首页),那我们如果想做到 app 一启动,首先全屏展示首页,当需要跳转到下一页时再进行分栏,那么我们可以通过封装自定义 router ,在页面跳转及页面关闭时计算当前路由栈的个数,并动态设置 navBarWidth 分栏的宽度即可实现该效果。

如下代码 router 封装较为简易,仅做演示,我使用的是根据 name 进行跳转,需要根据自身业务进行调整,如页面跳转传参等。

该 Router 类使用 @Observed 装饰,是为了使用类中 navBarWidth 动态属性,在首页面使用 @State 装饰接收 MyRouter,并在首页面的 Navigation 的 .navBarWidth() 中设置 this.MyRouter.navBarWidth ,当类中 navBarWidth 发生变化时,即可进行分栏比例 UI 的动态更新。

/**
 * 简易 router 封装
 */
@Observed
export class Router {
  navBarWidth: string = "100%"

  /**
   * 跳转
   * @param name
   * @param pageInfos
   */
  pushDestinationByName(name: string, pageInfos: NavPathStack) {
    pageInfos.pushDestinationByName(name, null)
    this.calcNavBarWidth(pageInfos)
  }

  backPress(pageInfos: NavPathStack) {
    let popR: NavPathInfo | undefined = pageInfos.pop()
    this.calcNavBarWidth(pageInfos)
    return popR
  }

  calcNavBarWidth(pageInfos: NavPathStack) {
    if (pageInfos.getAllPathName().length == 0) {
      this.navBarWidth = "100%"
    } else {
      this.navBarWidth = "50%"
    }
    console.log("luvi pageInfos > " + JSON.stringify(pageInfos))
  }
}

export const MyRouter = new Router()

6. 使用封装的 router 跳转页面

在第 2 步中,创建 Builder 构建函数后并配置了 route_map,并设置了页面名称 name,在第 5 步中封装的 pushDestinationByName 方法需要传递目标页面的 name 与路由栈,方法内则会使用该路由栈进行页面跳转,并计算分栏宽度。

// 直接使用封装的 MyRouter 进行跳转即可
MyRouter.pushDestinationByName("NewsPage", this.pageInfos)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 3项目创建与示例(Web+JPA)

以下是一个Spring Boot 3.3.4整合JPA的示例,它展示了如何在Spring Boot应用程序中使用JPA进行数据持久化。 版本与环境 Spring Boot 3.3.4数据库: MySQL 8.0.40, MySQL的安装使用可以参考: MySQL 8 下载与安装攻略JDK 17Maven 3.6项目创建 可以使用Spring Initializr 初始…

一家生物技术企业终止,科创属性可能不足,报告期内专利数猛增

轩凯生物九成以上营业收入来源于植物营养领域,收入来源结构单一,产品下游应用领域较为集中。报告期内公司应收账款账面价值逐年上升,回款比例显著低于前两年,遭交易所问询是否存在较大的坏账风险。 轩凯生物核心技术是否成熟以及是…

ssm智慧社区电子商务系统+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

Java面向对象编程进阶(四)

Java面向对象编程进阶(四) 一、equals()方法的使用二、toString()方法的使用三、复习 一、equals()方法的使用 适用性:任何引用数据都可以使用。 自定义的类在没有重写Object中equals()方法的情况下,调用的就是Object类中声明的…

C++初阶教程——C++入门

一、本章主要内容 C在C的基础之上,加入了面向对象编程的思想,并增加了许多有用的库以及编程范式。可以说,C是C的子集。在这章的内容中,笔者将会为诸位读者讲C如何补充C语言的一些不足。比如:作用域、IO、函数、指针等。…

Swift Macro 在业务开发中的探索与实践

简介 Swift Macro 在 Swift 5.9 版本中正式引入,且需配合 Xcode 15 使用。Swift Macro 作为一种新的设计方法,致力于帮开发者降低编写重复代码的繁琐,以更为简洁优雅的方式去实现。 在 OC 中,有大家熟知的宏 #define,…

Pseudo Multi-Camera Editing 数据集:通过常规视频生成的伪标记多摄像机推荐数据集,显著提升模型在未知领域的准确性。

2024-10-19,由伊利诺伊大学厄巴纳-香槟分校和香港城市大学的研究团队提出了一种创新方法,通过将常规视频转换成伪标记的多摄像机视角推荐数据集,有效解决了在未知领域中模型泛化能力差的问题。数据集的创建,为电影、电视和其他媒体…

练习LabVIEW第二十三题

学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第二十三题: 建立一个枚举控件,其内容为张三、李四、王五共三位先生,要求当枚举控件显…

Spring Boot 实现文件分片上传和下载

文章目录 一、原理分析1.1 文件分片1.2 断点续传和断点下载1.2 文件分片下载的 HTTP 参数 二、文件上传功能实现2.1 客户端(前端)2.2 服务端 三、文件下载功能实现3.1 客户端(前端)3.2 服务端 四、功能测试4.1 文件上传功能测试4.2 文件下载功能实现 参考资料 完整案例代码&…

分类预测|基于WOA鲸鱼优化K近邻KNN的数据分类预测Matlab程序 多特征输入多类别输出GWO-KNN

文章目录 一、基本原理原理流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 鲸鱼优化算法(WOA,Whale Optimization Algorithm)是一种模拟座头鲸捕猎行为的启发式优化算法,适用于解决各种优化问题。在K近邻&…

深度探索:超实用阿里云应用之低功耗模组AT开发示例

今天我们讲解一款低功耗4G全网通模组作为例子, 基于Air780EP模组AT开发的阿里云应用教程, 本文同样适用于以下型号: Air700ECQ/Air700EAQ/Air700EMQ Air780EQ/Air780EPA/Air780EPT/Air780EPS Air780E/Air780EX/Air724UG… 1、相关准备工作 …

大白话讲解分布式事务-SEATA事务四种模式(内含demo)

因为这里主要是讲解分布式事务,关于什么是事务,以及事务的特性,单个事务的使用方式,以及在Spring框架下,事务的传播方式,这里就不再赘述了。但是我这里要补充一点就是,一提到事务大家脑子里第一…

假如浙江与福建合并为“浙福省”

在中国,很多省份之间的关系颇有“渊源”,例如河南与河北、湖南与湖北、广东与广西等等,他们因一山或一湖之隔,地域相近、文化相通。 但有这么两个省份,省名没有共通之处,文化上也有诸多不同,但…

[简易版] 自动化脚本

前言 uniapp cli项目中没办法自动化打开微信开发者工具,需要手动打开比较繁琐,故此自动化脚本就诞生啦~ 实现 const spawn require("cross-spawn"); const chalk require("picocolors"); const dayjs require("dayjs&quo…

7.使用Redis进行秒杀优化

目录 1. 优化思路 总结之前实现的秒杀过程 下单流程 2. 使用Redis完成秒杀资格判断和库存 0. Redis中数据类型的选用 1.将优惠券信息保存到Redis中 2.基于Lua脚本,判断秒杀库存、一人一单,决定用户是否抢购成功 3. 开启新协程,处理数…

MongoDB-Plus

MongoDB-Plus是一款功能强大的数据库工具,它基于MongoDB,提供了更丰富的功能和更便捷的操作方式。以下是一篇关于MongoDB-Plus轻松上手的详细指南,旨在帮助初学者快速掌握其安装、配置和基础操作。 一、MongoDB-Plus概述 MongoDB是一款由C编…

鸿蒙next之导航组件跳转携带参数

官方文档推荐使用导航组件的形式进行页面管理,官方文档看了半天也没搞明白,查了各种文档才弄清楚。以下是具体实现方法: 在src/main/resources/base/profile下新建router_map.json文件 里边存放的是导航组件 {"routerMap" : [{&q…

鸿蒙API12 端云一体化开发——云函数篇

大家好,我是学徒小z,我们接着上次的端云一体化继续讲解,今天来说说云函数怎么创建和调用 文章目录 云函数1. 入口方法2. 编写云函数3. 进行云端测试4. 在本地端侧调用云函数5. 云函数传参6. 环境变量 云函数 1. 入口方法 在CloudProgram中…

软硬件开发面试问题大汇总篇——针对非常规八股问题的提问与应答(代码规范与生态管理)

软硬件开发,对于编码规范、生态管理等等综合问题的考察尤为重要。 阐述下环形缓冲区的用途 环形缓冲区(Ring Buffer)是一种固定大小的数据结构,常用于实现数据的流式传输或临时存储。在环形缓冲区中,当到达缓冲区的末尾…

Java Lock CyclicBarrier 总结

前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & CyclicBarrier & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & CyclicBarrier & 总结》(学习总结…