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

如何在Xamarin Forms中触发触摸开始事件(而非手指松开时)

解决TapGestureRecognizer触摸时立即触发的问题

TapGestureRecognizer的Tapped事件仅在手指抬起时触发,若要实现触摸按下瞬间就响应,可采用以下两种方案:


方案1:使用TouchGestureRecognizer(MAUI 7+推荐)

MAUI 7及以上版本新增了TouchGestureRecognizer,专门用于捕获触摸的按下、移动、抬起等事件,能直接满足需求:

XAML代码

<Image>
    <Image.GestureRecognizers>
        <TouchGestureRecognizer 
            TouchDown="OnImageTouchDown"
            TouchUp="OnImageTouchUp" /> <!-- 可选,触摸抬起时触发 -->
    </Image.GestureRecognizers>
</Image>

后台逻辑

private void OnImageTouchDown(object sender, TouchEventArgs e)
{
    // 在这里编写触摸开始时需要执行的代码
}

private void OnImageTouchUp(object sender, TouchEventArgs e)
{
    // 可选:触摸抬起时的处理逻辑
}

方案2:自定义触摸效果(兼容Xamarin.Forms/低版本MAUI)

如果项目基于Xamarin.Forms或低版本MAUI,可通过自定义路由效果监听原生触摸事件:

1. 创建共享项目的效果类

using Xamarin.Forms;

namespace YourAppNamespace
{
    public class TouchDownEffect : RoutingEffect
    {
        public event EventHandler TouchDown;

        public TouchDownEffect() : base("YourAppNamespace.TouchDownEffect")
        {
        }

        public void TriggerTouchDown()
        {
            TouchDown?.Invoke(this, EventArgs.Empty);
        }
    }
}

2. Android平台实现

using Android.Views;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ResolutionGroupName("YourAppNamespace")]
[assembly: ExportEffect(typeof(YourAppNamespace.Droid.TouchDownEffectDroid), "TouchDownEffect")]
namespace YourAppNamespace.Droid
{
    public class TouchDownEffectDroid : PlatformEffect
    {
        private TouchEventListener _listener;

        protected override void OnAttached()
        {
            _listener = new TouchEventListener(Control ?? Container);
            _listener.TouchDown += OnTouchDown;
            (Control ?? Container).Touch += _listener.OnTouch;
        }

        private void OnTouchDown(object sender, EventArgs e)
        {
            var effect = Element.Effects.FirstOrDefault(eff => eff is TouchDownEffect) as TouchDownEffect;
            effect?.TriggerTouchDown();
        }

        protected override void OnDetached()
        {
            if (_listener != null)
            {
                _listener.TouchDown -= OnTouchDown;
                (Control ?? Container).Touch -= _listener.OnTouch;
            }
        }

        private class TouchEventListener : Java.Lang.Object, View.IOnTouchListener
        {
            public event EventHandler TouchDown;

            public bool OnTouch(View v, MotionEvent e)
            {
                if (e.Action == MotionEventActions.Down)
                {
                    TouchDown?.Invoke(this, EventArgs.Empty);
                }
                return false;
            }
        }
    }
}

3. iOS平台实现

using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ResolutionGroupName("YourAppNamespace")]
[assembly: ExportEffect(typeof(YourAppNamespace.iOS.TouchDownEffectiOS), "TouchDownEffect")]
namespace YourAppNamespace.iOS
{
    public class TouchDownEffectiOS : PlatformEffect
    {
        protected override void OnAttached()
        {
            var nativeView = Control ?? Container;
            nativeView.TouchDown += OnTouchDown;
        }

        private void OnTouchDown(object sender, EventArgs e)
        {
            var effect = Element.Effects.FirstOrDefault(eff => eff is TouchDownEffect) as TouchDownEffect;
            effect?.TriggerTouchDown();
        }

        protected override void OnDetached()
        {
            var nativeView = Control ?? Container;
            nativeView.TouchDown -= OnTouchDown;
        }
    }
}

4. XAML中使用效果

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YourAppNamespace"
             x:Class="YourAppNamespace.MainPage">

    <Image>
        <Image.Effects>
            <local:TouchDownEffect TouchDown="OnImageTouchDown" />
        </Image.Effects>
    </Image>

</ContentPage>

后台逻辑

private void OnImageTouchDown(object sender, EventArgs e)
{
    // 触摸开始时执行的逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:16:38