Xamarin:获取手势触摸是不是在某个元素内

Posted

技术标签:

【中文标题】Xamarin:获取手势触摸是不是在某个元素内【英文标题】:Xamarin: get if a pangesture touch is inside a certain elementXamarin:获取手势触摸是否在某个元素内 【发布时间】:2020-01-14 15:42:54 【问题描述】:

有没有办法检查某个元素内是否有一个手势触摸,比如Frame

我在屏幕上添加了PanGestureRecognizer。在我的屏幕上,我有两个Frame,其中包含两个Image。我想要的是,当我在屏幕上移动手指时,当我的手指停在其中一个帧上时,我会注意到。我知道如何获取我的手指坐标 (e.TotalX; e.TotalY;),我的想法是检查它们是否在帧的范围内,但我不知道如何。

有什么建议吗?

代码

public MainPage()
    
        InitializeComponent();

        var panGesture = new PanGestureRecognizer();
        panGesture.PanUpdated += PanUpdated;
        mainLayout.GestureRecognizers.Add(panGesture);

        dog = new Frame
        
            BorderColor = Color.Blue,
            Padding = 4,
            Content = new Image
            
                Source = ImageSource.FromResource("AccessibilityImagesSound.Immagini.dog.png"),
                Aspect = Aspect.Fill,
            ,

        ;
        AutomationProperties.SetIsInAccessibleTree(dog, true);
        AutomationProperties.SetName(dog, "dog");
        AbsoluteLayout.SetLayoutBounds(dog, new Rectangle(0.2, 0.5, 0.30, 0.30));
        AbsoluteLayout.SetLayoutFlags(dog, AbsoluteLayoutFlags.All);
        mainLayout.Children.Add(dog);



        cat = new Frame
        
            BorderColor = Color.Blue,
            Padding = 4,
            Content = new Image
            
                Source = ImageSource.FromResource("AccessibilityImagesSound.Immagini.cat.png"),
                Aspect = Aspect.Fill,
            ,

        ;
        AutomationProperties.SetIsInAccessibleTree(cat, true);
        AutomationProperties.SetName(cat, "cat");
        AbsoluteLayout.SetLayoutBounds(cat, new Rectangle(0.8, 0.5, 0.30, 0.30));
        AbsoluteLayout.SetLayoutFlags(cat, AbsoluteLayoutFlags.All);
        mainLayout.Children.Add(cat);

    

    private void PanUpdated(object sender, PanUpdatedEventArgs e)
    
        switch (e.StatusType)
        
            case GestureStatus.Started:

                break;
            case GestureStatus.Running:

                //Here I think I have to check E.TotalX and e.TotalY

                break;
            case GestureStatus.Completed:
            case GestureStatus.Canceled: 
                break;
        
    

【问题讨论】:

【参考方案1】:

据我所知,在 xamarin 中获取 Touch 位置的唯一方法是通过本机触摸手势。

原生手势可以使用Effects 和this MSDocs link 完全实现。

使用 TouchEffect 可以轻松获取触摸的确切位置。下面给出了改变触摸框颜色的示例。

XAML:

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.Effects>
            <touch:TouchEffect TouchAction="Grid_TouchAction"/>
        </Grid.Effects>
        <Frame
            Grid.Row="1"
            BackgroundColor="Green"
            x:Name="leftFrame"/>
        <Frame
            Grid.Row="1"
            Grid.Column="1"
            BackgroundColor="Blue"
            x:Name="rightFrame"/>
    </Grid>

CS:

    private void Grid_TouchAction(object sender, TouchTracking.TouchActionEventArgs args)
    
        switch (args.Type)
        
            case TouchActionType.Moved:
                if (leftFrame.Bounds.Contains(args.Location))
                
                    leftFrame.BackgroundColor = Color.Red;
                
                else
                
                    leftFrame.BackgroundColor = Color.Green;
                

                if (rightFrame.Bounds.Contains(args.Location))
                
                    rightFrame.BackgroundColor = Color.Red;
                
                else
                
                    rightFrame.BackgroundColor = Color.Blue;
                
                break;
        
    

用户界面工作:

根据您的要求更改 TouchAction 事件处理程序。

【讨论】:

@Poli97,我认为您无法从 TapGestureRecognizer、PinchGestureRecognizer 或 PanGestureRecognizer 类中获取鼠标 x/y 坐标,作为 Nikhileshwar 的代码,您需要为每个平台实现自定义渲染器 TouchEffect 以获取位置。 @CherryBu-MSFT 好的,谢谢,你知道一种简单的方法来应用 TouchEffect 来实现Label 或其他元素的拖放吗?

以上是关于Xamarin:获取手势触摸是不是在某个元素内的主要内容,如果未能解决你的问题,请参考以下文章

如何以 xamarin 形式绘制图像?

Xamarin iOS (9.2):手势在模拟器中不起作用

Xamarin.Forms 第23局:手势识别

Xamarin.ios 手势密码

在 CALayer 上触摸手势

触摸手势