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

Xamarin中Skiasharp结合TouchTracking时TouchAction事件触发两次问题

Xamarin中Skiasharp+TouchTracking TouchAction事件重复触发的解决办法

TouchAction事件会在触摸的不同阶段触发(比如Pressed按下、Moved移动、Released松开、Cancelled取消),如果不对动作类型做过滤,每个阶段都会执行你的代码,导致重复输出或重复播报。另外也可能是不小心给控件重复绑定了这个事件。

解决步骤

1. 过滤触摸动作类型

在事件处理方法里,先判断动作类型,只处理你需要的阶段,比如只响应首次按下:

void OnTouchEffectAction(object sender, TouchActionEventArgs args)
{
    // 只处理按下动作,跳过其他阶段
    if (args.Type != TouchActionType.Pressed)
        return;

    pt.X = XamDIUConvertToPixels(args.Location.X);
    pt.Y = XamDIUConvertToPixels(args.Location.Y);
    Console.WriteLine($"location X: {pt.X}\n location Y: {pt.Y}\n");
}

如果是需要跟踪触摸移动,就保留TouchActionType.Moved;如果是点击操作,用Pressed或Released都可以,根据需求选。

2. 检查事件绑定是否重复

确认你没在XAML和代码后台同时绑定TouchAction事件:

  • 别一边在XAML里写touch:TouchEffect.TouchAction="OnTouchEffectAction",一边又在构造函数或OnAppearing里调用TouchEffect.SetTouchAction(yourSkiaView, OnTouchEffectAction)。

3. 阻止事件冒泡(如果有嵌套控件)

如果你的SkiaSharp控件嵌套在其他可触摸控件里,可能会导致父控件和子控件都触发触摸事件。这种情况可以在处理完逻辑后设置args.Handled = true,阻止事件往上传递:

void OnTouchEffectAction(object sender, TouchActionEventArgs args)
{
    if (args.Type != TouchActionType.Pressed)
        return;

    // 阻止事件传递给父控件
    args.Handled = true;

    pt.X = XamDIUConvertToPixels(args.Location.X);
    pt.Y = XamDIUConvertToPixels(args.Location.Y);
    Console.WriteLine($"location X: {pt.X}\n location Y: {pt.Y}\n");
}

改完之后测试一下,触摸操作后控制台应该只会输出一次,语音合成也不会重复播报了。

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:05:23