Объедините TapGestureRecognizer и PanGestureRecognizer в Xamarin Android - PullRequest
0 голосов
/ 22 января 2020

У меня следующая структура.

Frame frame = new Frame();
Grid grid = new Grid();
ContentView contentView = new ContentView();
contentView.GestureRecognizers.Add(CreateSwipeEffect());
grid.Children.Add(contentView, 0, 0);
frame.GestureRecognizers.Add(CreateFrameTapEffect());
frame.Content = grid;

В кадре доступно два эффекта: сначала мы можем провести (PanGesture), а затем мы можем нажать (TapGesture). На платформе iOS это решение отлично работает. Однако на платформе Android срабатывает только ударный эффект. Как я могу решить эту проблему, чтобы оба эффекта были доступны для платформы Android?

Ответы [ 2 ]

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

Я использую ваш код в iOS и Android, да, он отлично работает на iOS и вызывает проблемы на Android.

Но если вы добавляете tapGenture и panGesture после добавления контроль надписью или рамкой, он может работать нормально. Возможно, некоторые механизмы Android немного отличаются от iOS. Пожалуйста, посмотрите следующий код, я проверяю его на Android и iOS, все работает нормально.

 public Page17()
    {
        InitializeComponent();

        var panGesture = new PanGestureRecognizer();
        panGesture.PanUpdated += PanGesture_PanUpdated;
        var tapGenture = new TapGestureRecognizer();
        tapGenture.NumberOfTapsRequired = 1;
        tapGenture.Tapped += TapGenture_Tapped;

        Frame frame = new Frame();
        frame.BackgroundColor = Color.AliceBlue;
        Grid grid = new Grid();
        Label label= new Label();
        label.Text = "this is test!";
        label.BackgroundColor = Color.Red;



        grid.Children.Add(label,0,0);

        frame.Content = grid;
        stacklayout1.Children.Add(frame);

        frame.GestureRecognizers.Add(tapGenture);

        label.GestureRecognizers.Add(panGesture);
    }

    private void TapGenture_Tapped(object sender, EventArgs e)
    {
        Console.WriteLine("the tapgesture fire!");
    }

    private void PanGesture_PanUpdated(object sender, PanUpdatedEventArgs e)
    {
        Console.WriteLine("the pangesture fire");
    }
0 голосов
/ 24 января 2020

Вы отправляете событие Tap to Frame (родитель) и событие Swip в ContentView (childview). Согласно Обзор входных событий :

Помните, что события аппаратных клавиш всегда доставляются в представление, которое в данный момент находится в фокусе. Они отправляются, начиная с вершины иерархии View, а затем вниз, пока не достигнут нужного места назначения.

Таким образом, исходя из ваших кодов, когда вы нажимаете на Frame, android системная мысль Вы хотите запустить событие касания в ContentView (который не существует), потому что текущим фокусом является представление контента, а не фрейм. Поэтому, если вы указали, что c должен это сделать, вам нужно попробовать другие способы его реализации. Если нет, зарегистрируйте событие касания в ContentView.

...