C# Xamarin:如何获取光标/触摸坐标(位置X和Y)? 介绍
我正在创建我的第一个Xamarin应用程序(它将首先针对UWP,然后是Android,最后可能是iOS) 基本上,应用程序应该检测到多个手指,圆圈将在每个手指上弹出并跟随它们 我的应用程序 首先,我认为UI和图形不能用Xamarin编码,所以我开始使用UWP代码: MainPage.xaml.cs MainPage.xaml MainPage.xamlC# Xamarin:如何获取光标/触摸坐标(位置X和Y)? 介绍,c#,xamarin,xamarin.forms,skiasharp,mr.gestures,C#,Xamarin,Xamarin.forms,Skiasharp,Mr.gestures,我正在创建我的第一个Xamarin应用程序(它将首先针对UWP,然后是Android,最后可能是iOS) 基本上,应用程序应该检测到多个手指,圆圈将在每个手指上弹出并跟随它们 我的应用程序 首先,我认为UI和图形不能用Xamarin编码,所以我开始使用UWP代码: MainPage.xaml.cs MainPage.xaml MainPage.xaml 最后,它只停留在每个接触点的X和Y位置,以绘制椭圆。 正如您所看到的,我用不同的方式查看:TapGestureRecognitizer
最后,它只停留在每个接触点的X和Y位置,以绘制椭圆。
正如您所看到的,我用不同的方式查看:TapGestureRecognitizer
,PangestureRecognitizer
但我找不到那些合作伙伴
我找到了API,但它是根据每个应用程序的名称授权的
问题
所以,我在问实验人员:
- Xamarin是否提供触摸位置/手势API
- 你知道比尔斯先生是谁吗 处理触摸的最佳解决方案
- 是否有其他触摸共享代码 API
TapGestureRecognitzer
、PinchGestureRecognitzer
或PangestureRecognitzer
类,如您所述,但仅此而已。它们都不会给你x/y坐标
手势是处理触摸的最佳解决方案吗
我遇到了同样的问题。如果您不想重新发明轮子,那么您肯定应该使用外部API
比尔斯先生做得很好。不幸的是,我还没有听说过任何免费的API。正如您所提到的,它是每个许可的应用程序:(
或者简单地说,我如何获得所有接触点的坐标
沙马林
你应该为每个平台实现自定义渲染器(在你的例子中是UWP)。这就是手势先生在幕后为你做的。如果你不想自己实现,目前你唯一的选择就是使用外部API
也许有一天,Xamarin会提供这种开箱即用的API……让我们祈祷吧
希望这有帮助!很晚了,但是如果您使用Skia,您可以添加以下Nuget:
您将能够在场景中跟踪您的触摸位置。General skia sharp touch交互文档位于此处:这些文档中使用的触摸效果可能是与原始帖子相关的最有用的
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Windows.Input;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Devices.Input;
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;
using Windows.UI.Input;
using Windows.UI.Xaml.Shapes;
using Windows.UI;
namespace App1.UWP
{
public sealed partial class MainPage
{
public MainPage()
{
this.InitializeComponent();
LoadApplication(new App1.App());
}
private async void OnPointerPressed(object sender, PointerRoutedEventArgs e)
{
Debug.WriteLine(e.Pointer.PointerDeviceType + " " + sender + " " + e);
Point pointerPos = e.GetCurrentPoint(rootPanel).Position;
Debug.WriteLine(pointerPos.X + " " + pointerPos.Y);
Ellipse ellipse1 = new Ellipse();
ellipse1.Fill = new SolidColorBrush(Colors.SteelBlue);
ellipse1.Width = 100;
ellipse1.Height = 100;
//ellipse1.Margin.Left = pointerPos.X + 50;
//ellipse1.Margin.Top = pointerPos.Y + 50;
rootPanel.Children.Add(ellipse1);
Debug.WriteLine(rootPanel.Children.Count);
switch (e.Pointer.PointerDeviceType)
{
case PointerDeviceType.Touch:
break;
case PointerDeviceType.Pen:
break;
case PointerDeviceType.Mouse:
ContentDialog noMouseAvaliableDialog = new ContentDialog()
{
Title = "Erreur de méthode d'entrée",
Content = "Il est impossible de savoir qui va jouer en premier aver un joueur :(\n Veuillez essayer avec le clavier.",
PrimaryButtonText = "OK chef"
};
await noMouseAvaliableDialog.ShowAsync();
break;
default:
break;
}
Debug.WriteLine("-------------------------");
}
}
}
<forms:WindowsPage
x:Class="App1.UWP.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:forms="using:Xamarin.Forms.Platform.UWP"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1.UWP"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
PointerPressed="OnPointerPressed">
<RelativePanel
Name="rootPanel"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
</RelativePanel>
</forms:WindowsPage>
using SkiaSharp;
using SkiaSharp.Views.Forms;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace App1
{
public partial class MainPage : ContentPage
{
private static SKCanvas canvas;
public MainPage()
{
InitializeComponent();
}
private void OnPainting(object sender, SKPaintSurfaceEventArgs e)
{
canvas = e.Surface.Canvas;
}
private void onTapGestureRecognizerTapped(object sender, EventArgs e)
{
Debug.WriteLine("Tapped !!!!!");
//((TappedEventArgs) e).
}
/*private void onPanUpdated(object sender, PanUpdatedEventArgs e)
{
Debug.WriteLine("Panned !!!!!" + e.TotalX + " " + e.TotalY);
}*/
internal void drawCircleOnCanvas(Point pointerPos, int radius)
{
Debug.WriteLine(pointerPos.X + " " + pointerPos.Y);
SKPaint circleFill = new SKPaint
{
IsAntialias = true,
Style = SKPaintStyle.Fill,
Color = SKColors.AliceBlue
};
canvas.DrawCircle(((float) pointerPos.X - 50), ((float) pointerPos.Y - 50), radius, circleFill);
}
}
}
<?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:App1"
x:Class="App1.MainPage"
xmlns:views="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms">
<Label Text="Ooooh, you touch my tralala"
VerticalOptions="Center"
HorizontalOptions="Center" />
<!--<relativelayout
x:Name="rootPanel"
backgroundcolor="lime"
horizontaloptions="fill"
verticaloptions="fill">
</relativelayout>-->
<Grid>
<views:SKCanvasView PaintSurface="OnPainting"/>
<Grid.GestureRecognizers>
<TapGestureRecognizer
Tapped="onTapGestureRecognizerTapped"
NumberOfTapsRequired="1"/>
<!--<PanGestureRecognizer PanUpdated="onPanUpdated"/> -->
</Grid.GestureRecognizers>
</Grid>
</ContentPage>