Xamarin: получите, если прикосновение к уколу внутри определенного элемента - PullRequest
0 голосов
/ 14 января 2020

Есть ли способ проверить, находится ли прикосновение пагестуры внутри определенного элемента, например 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 Ответ

1 голос
/ 15 января 2020

Насколько я знаю, единственный способ определить местоположение Touch в xamarin - это использовать собственные сенсорные жесты.

Нативные жесты могут использоваться с использованием Effects и , эта ссылка MSDocs полностью реализована.

Используя 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;
        }
    }

Рабочий интерфейс:

enter image description here

Измените обработчик событий TouchAction согласно вашему требованию.

...