基于Xamarin Forms的移动端应用能否追踪触控笔的悬停位置?
获取三星触控笔悬停位置(Xamarin Forms + SkiaSharp)
由于Xamarin Forms本身未提供直接处理触控笔悬停的API,需通过Android平台自定义渲染器对接原生事件来实现,以下是具体步骤:
1. 实现Android平台自定义渲染器
在Android项目中创建继承自SKCanvasViewRenderer的自定义渲染器,重写OnGenericMotionEvent方法捕获触控笔悬停事件:
using Android.Content; using Android.Views; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; using SkiaSharp.Views.Android; [assembly: ExportRenderer(typeof(SKCanvasView), typeof(CustomSkiaCanvasRenderer))] namespace YourAppNamespace.Droid { public class CustomSkiaCanvasRenderer : SKCanvasViewRenderer { public CustomSkiaCanvasRenderer(Context context) : base(context) { } public override bool OnGenericMotionEvent(MotionEvent e) { // 过滤触控笔悬停移动事件 if (e.Action == MotionEventActions.HoverMove && e.ToolType(0) == MotionEventToolType.Stylus) { // 获取原生屏幕坐标 float rawX = e.GetX(); float rawY = e.GetY(); // 转换为SkiaSharp画布的逻辑坐标 var formsPoint = Control.ToCanvasPoint(rawX, rawY); // 通过MessagingCenter将坐标传递到Forms层 MessagingCenter.Send<object, Point>(this, "StylusHover", formsPoint); return true; } return base.OnGenericMotionEvent(e); } } }
2. 在Forms层接收并处理悬停坐标
在包含SKCanvasView的页面中订阅MessagingCenter事件,拿到坐标后更新落点圆圈:
public partial class DrawingPage : ContentPage { private Point _currentHoverPoint; public DrawingPage() { InitializeComponent(); MessagingCenter.Subscribe<object, Point>(this, "StylusHover", (sender, point) => { _currentHoverPoint = point; // 触发画布重绘,更新悬停圆圈位置 skiaCanvasView.InvalidateSurface(); }); } private void SkiaCanvasView_OnPaintSurface(object sender, SKPaintSurfaceEventArgs e) { var canvas = e.Surface.Canvas; canvas.Clear(); // 绘制悬停落点圆圈 if (_currentHoverPoint != default) { using var paint = new SKPaint { Color = SKColors.LightBlue, Style = SKPaintStyle.Stroke, StrokeWidth = 2 }; canvas.DrawCircle((float)_currentHoverPoint.X, (float)_currentHoverPoint.Y, 10, paint); } } }
3. 关键注意事项
- 设备兼容性:三星Galaxy Tab的S Pen原生支持
ACTION_HOVER_MOVE事件,无需额外权限,但需确保应用未禁用触控相关权限。 - 坐标转换:使用
ToCanvasPoint方法将Android原生坐标转换为SkiaSharp画布的逻辑坐标,避免布局缩放、偏移导致的位置偏差。 - 事件过滤:通过
MotionEventToolType.Stylus区分触控笔和手指操作,避免误触发。
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

