问题描述
我在 Android 上使用带有 ESRI 地图视图的 Xamarin.Forms TouchEffect 时遇到困难。以下是有关 TouchEffect 和 ESRI 的 .net Xamarin Forms SDK 的更多详细信息。
TouchEffect 适用于 iOS 和其他 Xamarin.Forms 控件,但不适用于 Android 上的地图视图。
我认为问题在于触摸事件如何通过可视化树传播并在 TouchEffect 实际得到通知之前由地图视图控件使用。我的这个假设可能是错误的。
这是关于 Android 上的事件的精彩 post 讨论。
有人能想出一种解决方法如何将触摸事件同时发送到 ESRI 控件和 TouchEffect 吗?
我尝试了几种解决方法,但都无济于事。
-
我尝试使用自定义渲染器实现 Grid 控件,该渲染器会在其任何子级之前收到触摸事件的通知。理想情况下,它会将触摸事件传递给地图视图和触摸效果。 这失败了,因为由于某种原因我无法通过订阅 Android 视图的触摸事件来获得触摸事件。使用 GestureRecognizer 并不会削减它,因为它没有提供足够的信息。
-
在 Android 的 MainActivity 中监听触摸事件并将该信息传递给 TouchEffect。我在 MainActivity 中获得了触摸事件,但后来我无法弄清楚实际触摸了哪个视图。这尤其成问题,因为其他视图将覆盖在地图上。
以下是一些显示问题的代码摘录,而完整的代码可以在 here 中找到。我在顶部有 MapView 控件,在下面有一个简单的 BoxView。当您点击其中任何一个时,您应该会看到一个警报弹出窗口,当您点击 BoxView 时,该弹出窗口仅适用于 Android
截图
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 (将#修改为@)