Xamarin.Forms 和 ESRI 的 MapView

问题描述

我在 Android 上使用带有 ESRI 地图视图的 Xamarin.Forms TouchEffect 时遇到困难。以下是有关 TouchEffect 和 ESRI 的 .net Xamarin Forms SDK 的更多详细信息。

TouchEffect 适用于 iOS 和其他 Xamarin.Forms 控件,但不适用于 Android 上的地图视图。 我认为问题在于触摸事件如何通过可视化树传播并在 TouchEffect 实际得到通知之前由地图视图控件使用。我的这个假设可能是错误的。
这是关于 Android 上的事件的精彩 post 讨论。

有人能想出一种解决方法如何将触摸事件同时发送到 ESRI 控件和 TouchEffect 吗?

我尝试了几种解决方法,但都无济于事。

  1. 我尝试使用自定义渲染器实现 Grid 控件,该渲染器会在其任何子级之前收到触摸事件的通知。理想情况下,它会将触摸事件传递给地图视图和触摸效果。 这失败了,因为由于某种原因我无法通过订阅 Android 视图的触摸事件来获得触摸事件。使用 GestureRecognizer 并不会削减它,因为它没有提供足够的信息。

  2. 在 Android 的 MainActivity 中监听触摸事件并将该信息传递给 TouchEffect。我在 MainActivity 中获得了触摸事件,但后来我无法弄清楚实际触摸了哪个视图。这尤其成问题,因为其他视图将覆盖在地图上。

以下是一些显示问题的代码摘录,而完整的代码可以在 here 中找到。我在顶部有 MapView 控件,在下面有一个简单的 BoxView。当您点击其中任何一个时,您应该会看到一个警报弹出窗口,当您点击 BoxView 时,该弹出窗口仅适用于 Android

截图

enter image description here

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TouchTrackingEffectDemos"
             xmlns:esriui="clr-namespace:Esri.ArcGISRuntime.Xamarin.Forms;assembly=Esri.ArcGISRuntime.Xamarin.Forms"
             xmlns:tt="clr-namespace:TouchTracking"
             x:Class="TouchTrackingEffectDemos.HomePage"
             Title="Touch Tracking Effect">

    <Grid>
        <Grid.RowDeFinitions>
            <RowDeFinition Height="*"/>
            <RowDeFinition Height="*"/>
        </Grid.RowDeFinitions>

        <!-- MapView-->
        <Grid>
            <esriui:MapView x:Name="MyMapView"/>
            <Grid.Effects>
                <tt:TouchEffect Capture="True" TouchAction="TouchEffect_MapView" />
            </Grid.Effects>
        </Grid>

        <!-- BoxView-->
        <Grid Grid.Row="1">
            <BoxView BackgroundColor="Blue"/>

            <Grid.Effects>
                <tt:TouchEffect Capture="True" TouchAction="TouchEffect_BoxView" />
            </Grid.Effects>
        </Grid>
        
    </Grid>
</ContentPage>

背后的代码

using System;
using System.Windows.Input;
using Esri.ArcGISRuntime.Mapping;
using TouchTracking;
using Xamarin.Forms;

    namespace TouchTrackingEffectDemos
    {
        public partial class HomePage : ContentPage
        {
            public HomePage()
            {
                InitializeComponent();
                MyMapView.Map = new Map(BasemapType.Imagery,42.175131,9.192313,8);
                BindingContext = this;
            }
    
            private void TouchEffect_BoxView(object sender,TouchActionEventArgs args)
            {
                displayAlert("touch","Box view","close");
            }
    
            private void TouchEffect_MapView(object sender,"map view","close");
            }
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)