往期推文全新看点(文中附带全新鸿蒙5.0全栈学习笔录)

✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

✏️ 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

✏️ 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

✏️ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

✏️ 市场巨变,移动开发行业即将迎来“第二春”?

✏️ 记录一场鸿蒙开发岗位面试经历~

✏️ 持续更新中……


介绍

本示例提供组件实例在页面间共享的解决方案:通过 Stack 容器,下层放地图组件,上层放 Navigation 组件来管理页面,页面可以共享下层的地图组件,页面中需要显示地图的区域设置为透明,并参考 触摸交互控制 ,设置事件透传及响应区域。

效果图预览

使用说明

页面间共享地图组件的场景:

  • 使用地图组件替换代码中 模拟的地图组件 。
  • 添加新页面,需要预留地图组件的显示区域。

其他组件实例共享的场景:

  • 参考实现思路即可。

实现思路

场景:组件实例页面间共享

本示例实现模拟的地图组件实例在两个页面间共享。

  • 通过Stack容器,下层放地图组件,上层放Navigation组件管理两个页面,且需要设置Navigation组件的事件透传到地图组件。
  build() {
    Stack({alignContent: Alignment.Bottom}) {
      // 地图组件放在底层,navigation组件放在上层,navigation中的页面需要显示地图组件的位置处设置透明和事件透传
      MapComponent()
      // 应用主页用NavDestination承载,Navigation为空页面直接跳转到MainPage主页面
      Navigation(this.pageStackForComponentSharedPages) {
      }
      .onAppear(()=>{
        this.pageStackForComponentSharedPages.pushPathByName("MainPage", null, false)
      })
      .hideTitleBar(true)
      // navigation组件设置事件透传给兄弟组件
      .hitTestBehavior(HitTestMode.Transparent)
      .navDestination(this.pageMap)
    }
    .width('100%')
    .height('100%')
  }
  • Navigation中的页面需要显示地图的区域设置透明,由于本示例主页面是一个Scroll,所以选择放一个空的Column容器组件占位。
 // 页面用于显示地图的区域,放一个空的容器组件,背景默认透明,来显示下层的地图组件(该组件父组件也需要设置透明)
 Column() {
 }
 .width('100%')
 .height(this.transParentInitHeight)
  • 为避免上层内容区域(非透明区域)的事件也影响下层地图组件,需要分别设置地图组件和内容区域对事件的响应范围,两组响应区域不重叠,随内容区域的变化而变化。
  // 地图组件的手势事件响应区域设置
  .responseRegion({
    x: 0,
    y: 0,
    width: '100%',
    height: this.mapResponseRegionHeight
  })
  // 主页面的手势事件响应区域设置
  .responseRegion({
    x: 0,
    y: this.mapResponseRegionHeight,
    width: '100%',
    height: this.pageHeight - this.mapResponseRegionHeight
  })
  • 主页面Scroll滑动过程中Column组件(透明,用于显示下层地图组件)逐渐划出页面,地图的显示区域随之变化,因此需要滑动过程中更新地图的事件响应区域。
  .onScrollFrameBegin((offset) => {
    this.scrollCurOffset = this.scroller.currentOffset().yOffset;
    this.mapResponseRegionHeight =
      this.transParentInitHeight - this.scrollCurOffset > 0 ? this.transParentInitHeight - this.scrollCurOffset:0;
    return {offsetRemain : offset}
  })

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐