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
相关产品推荐
相关产品推荐

