毛伊岛地图中图钉的延迟加载会在每次更新时闪烁/重新绘制所有图钉

Lazy loading of pins in Maui maps flickers/re-draws all the pins at every update

提问人:Uderly 提问时间:11/17/2023 最后编辑:Uderly 更新时间:11/17/2023 访问量:32

问:

我正在尝试延迟加载我需要在地图上显示的 300 多个图钉的集合。

考虑到我的图钉数据对于 API 来说并不多,我只在“Component_Loaded”事件中加载此信息一次,因此我有一个 ObservableCollection _allProviders,其中包含我在地图导航期间需要的所有数据。

根据这些数据,我可以为每个“提供者”计算用户当前在地图上显示的可见区域中心的距离。这个算法似乎效果很好。

我尝试了许多不同的方法,例如使用 MvvmHelpers.ObservableRangeCollection 或去抖动器一次添加多个引脚。没有运气。:/

我遇到的问题是,每次我添加一个新图钉,标记都会重新绘制(导致“闪烁”),而且看起来并不好看。一旦加载了一个区域的所有引脚,性能就会完美。

我尚未设法实现的一个选项可能是 - 以某种方式 - 停止地图更新并在添加一些新引脚时调用它,但老实说,我缺乏想法,我不想尝试替代地图组件。

我真的很感激一些帮助,谢谢。


    using Microsoft.Maui.Controls.Maps;

    ...

    public MapsView()
    {
        InitializeComponent();

        if (DeviceInfo.Platform == DevicePlatform.Android || DeviceInfo.Platform == DevicePlatform.iOS)
        {
            map.IsShowingUser = true;

            map.Loaded += Component_Loaded;
            map.PropertyChanged += HandleVisibleRegionEvent;
        }
    }

    private async void HandleVisibleRegionEvent(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "VisibleRegion")
        {
            foreach (Provider p in _allProviders)
            {
                if (!p.IsMapped)
                {
                    var d = GeoCalculator.CalculateDistance(p.Location.Latitude, p.Location.Longitude, map.VisibleRegion.Center.Latitude, map.VisibleRegion.Center.Longitude);

                    if (d < map.VisibleRegion.Radius.Kilometers)
                    {
                        p.IsMapped = true;

                        map.Pins.Add(new Pin()
                        {
                            Label = p.title,
                            Location = p.Location
                        });

                        await Task.Delay(100);
                    }
                }
            }
        }
    }
Xamarin.Forms 映射 google-maps-markers Maui 图钉

评论

0赞 Peter Wessberg 11/17/2023
你看到很多垃圾回收吗?

答: 暂无答案