HarmonyOS鸿蒙Next中在Scroll中地图无法垂直滑动

HarmonyOS鸿蒙Next中在Scroll中地图无法垂直滑动 因为 scroll组件和map的垂直滑动有冲突,所以地图可能无法垂直滑动

修改方式如下

可以通过在MapConponent的onTouch事件中确认父组件Scroll的滑动状态,若点击到Map则Scroll不响应滑动,松开时恢复,参考代码如下:

import { MapComponent, mapCommon, map } from '@kit.MapKit';

import { AsyncCallback } from '@kit.BasicServicesKit';

import { Const } from '../common/constants/CommonConstants';

@Entry

@Component

struct HuaweiMapDemo {

  private TAG = "HuaweiMapDemo";

  private mapOptions?: mapCommon.MapOptions;

  private callback?: AsyncCallback<map.MapComponentController>;

  private mapController?: map.MapComponentController;

  private mapEventManager?: map.MapEventManager;

  //控制外层Scroll能否垂直滚动

  @State scrollable: ScrollDirection = ScrollDirection.Vertical

  aboutToAppear(): void {

    // 地图初始化参数,设置地图中心点坐标及层级

    this.mapOption = {

      //...

    };

    // 地图初始化的回调

    this.callback = async (err, mapController) => {

      // ...

    };

  }

   build() {

    Stack() {

      Scroll() {

        Column() {

          // 调用 MapComponent初始化地图

          MapComponent({ mapOptions: this.mapOptions, mapCallback: this.callback })

            .width('100%')

            .onTouch((event) => {

              switch (event.type) {

                case TouchType.Down:

                  this.scrollable = ScrollDirection.None

                  break;

                case TouchType.Up:

                  this.scrollable = ScrollDirection.Vertical

                  break;

                case TouchType.Cancel:

                  this.scrollable = ScrollDirection.Vertical

                  break;

              }

            }).height(700)


          Text("AAA")

            .width("100%")

            .textAlign(TextAlign.Center)

            .height("40%")

            .backgroundColor(Color.Green)

            .height(600)

        }

      }

      .scrollable(this.scrollable)

      .onScrollStart(() => {

        console.log("==== onScrollStart")

      })

      .onScrollStop(() => {

        console.log("==== onScrollStop")

      })

      .width('100%')

      .height("100%")

      .backgroundColor(Color.Red)

      .padding(10)

    }.height('100%')

  }

}

更多关于HarmonyOS鸿蒙Next中在Scroll中地图无法垂直滑动的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,Scroll组件内嵌套Map组件时,默认会优先响应Map的触摸事件,导致垂直滑动被Map拦截。可通过设置Map组件的gestureEnabled属性为false来禁用地图手势,或使用ScrollnestedScroll属性协调滚动优先级。

更多关于HarmonyOS鸿蒙Next中在Scroll中地图无法垂直滑动的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个问题确实常见,是Scroll容器与Map组件手势冲突的典型场景。你提供的解决方案思路正确,通过动态控制Scroll的滚动方向来优先响应地图的触摸事件。

核心逻辑是:当手指触摸到地图时(TouchType.Down),将Scroll的滚动方向设置为None,禁止外层滚动;当手指抬起(TouchType.Up)或触摸事件被取消(TouchType.Cancel)时,恢复Scroll的垂直滚动能力。这样就能确保地图的拖拽、缩放等手势操作被正确响应。

代码实现上需要注意几点:

  1. ScrollDirection 需要正确导入,通常来自@ohos.arkui.ability.Component
  2. 确保onTouch事件绑定在MapComponent上,而不是其父容器。
  3. 此方法主要解决了垂直滑动的冲突。如果存在水平滑动冲突,逻辑需相应调整。

这是一种有效的客户端解决方案,避免了组件间的事件竞争。

回到顶部