You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:27:13