xamarin.forms - Xamarin:获取一个手势触摸是否在某个元素内
问题描述
有没有办法检查一个手势是否在某个元素内,比如一个Frame
?
PanGestureRecognizer
我在屏幕上添加了一个。在我的屏幕中,我有两个Frame
包含两个Image
. 我想要的是,当我在屏幕上移动手指时,当我的手指停在其中一个帧上时,我会注意到。我知道如何获取我的手指坐标(e.TotalX; e.TotalY;
),我的想法是检查它们是否在框架的范围内,但我不知道如何。
有什么建议吗?
代码
public MainPage()
{
InitializeComponent();
var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += PanUpdated;
mainLayout.GestureRecognizers.Add(panGesture);
dog = new Frame
{
BorderColor = Color.Blue,
Padding = 4,
Content = new Image
{
Source = ImageSource.FromResource("AccessibilityImagesSound.Immagini.dog.png"),
Aspect = Aspect.Fill,
},
};
AutomationProperties.SetIsInAccessibleTree(dog, true);
AutomationProperties.SetName(dog, "dog");
AbsoluteLayout.SetLayoutBounds(dog, new Rectangle(0.2, 0.5, 0.30, 0.30));
AbsoluteLayout.SetLayoutFlags(dog, AbsoluteLayoutFlags.All);
mainLayout.Children.Add(dog);
cat = new Frame
{
BorderColor = Color.Blue,
Padding = 4,
Content = new Image
{
Source = ImageSource.FromResource("AccessibilityImagesSound.Immagini.cat.png"),
Aspect = Aspect.Fill,
},
};
AutomationProperties.SetIsInAccessibleTree(cat, true);
AutomationProperties.SetName(cat, "cat");
AbsoluteLayout.SetLayoutBounds(cat, new Rectangle(0.8, 0.5, 0.30, 0.30));
AbsoluteLayout.SetLayoutFlags(cat, AbsoluteLayoutFlags.All);
mainLayout.Children.Add(cat);
}
private void PanUpdated(object sender, PanUpdatedEventArgs e)
{
switch (e.StatusType)
{
case GestureStatus.Started:
break;
case GestureStatus.Running:
//Here I think I have to check E.TotalX and e.TotalY
break;
case GestureStatus.Completed:
case GestureStatus.Canceled:
break;
}
}
解决方案
据我所知,在 xamarin 中获取 Touch 位置的唯一方法是通过本机触摸手势。
可以使用本机手势,Effects
并且此 MSDocs 链接已完整实现它。
使用 TouchEffect 可以轻松获取触摸的确切位置。下面给出了改变触摸框颜色的示例。
XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.Effects>
<touch:TouchEffect TouchAction="Grid_TouchAction"/>
</Grid.Effects>
<Frame
Grid.Row="1"
BackgroundColor="Green"
x:Name="leftFrame"/>
<Frame
Grid.Row="1"
Grid.Column="1"
BackgroundColor="Blue"
x:Name="rightFrame"/>
</Grid>
CS :
private void Grid_TouchAction(object sender, TouchTracking.TouchActionEventArgs args)
{
switch (args.Type)
{
case TouchActionType.Moved:
if (leftFrame.Bounds.Contains(args.Location))
{
leftFrame.BackgroundColor = Color.Red;
}
else
{
leftFrame.BackgroundColor = Color.Green;
}
if (rightFrame.Bounds.Contains(args.Location))
{
rightFrame.BackgroundColor = Color.Red;
}
else
{
rightFrame.BackgroundColor = Color.Blue;
}
break;
}
}
用户界面工作:
根据您的要求更改 TouchAction 事件处理程序。
推荐阅读
- arrays - 使用正则表达式在 json 数组值中查找数字
- kubernetes - 我找不到用 influxdb 设置 grafana 仪表板来监控 kubernetes 集群的方法
- c++ - 如何用 gcc 或 clang 模拟 _mm256_loadu_epi32?
- android - 如何解决android资源链接失败?
- twitter - rtweet 的 get_timeline 中是否有与 max_id 等效的 min_id?
- html - 需要帮助创建一个充满图像的响应式页脚
- reactjs - 如何将处理函数用于两种不同的目的。SPFX(反应/打字稿)
- c++ - 还有其他方法可以在数组中写入多维数组吗?
- python-3.x - 服务器端的阻塞和非阻塞调用,为什么异步客户端很重要?
- spring - 从 spring 配置服务器获取任何服务的属性