【问题标题】:Combine TapGestureRecognizer and PanGestureRecognizer in Xamarin Android在 Xamarin Android 中结合 TapGestureRecognizer 和 PanGestureRecognizer
【发布时间】:2020-01-24 16:40:09
【问题描述】:

我有以下结构。

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;

Frame 有两种效果:首先我们可以滑动(PanGesture),其次我们可以点击(TapGesture)。在 iOS 平台上,此解决方案完美运行。然而,在 Android 平台上,只有滑动效果才会触发。如何解决这个问题以使这两种效果都适用于 Android 平台?

【问题讨论】:

    标签: android xamarin xamarin.forms xamarin.android


    【解决方案1】:

    我在 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");
        }
    

    【讨论】:

    • @Cherry Bu - MSFT 使用内容视图解决方案准确检查。
    • @Cherry Bu - MSFT。我建议在框架中扩展标签以填充最大值。那么只有平移手势效果有效,所以不是很好的解决方案。
    • @maciejka,当我在框架中扩展标签时,我可以重现您的问题,请在 github 中为 Xamarin.Forms 反馈此问题,我也将此问题反馈给 Microsoft 团队,谢谢。
    • 在您的示例中,红色标签未完全垂直和水平填充网格。当你完全填充时,没有空白,然后点击效果不起作用,只有平移手势效果起作用。
    【解决方案2】:

    您正在将 Tap 事件分派给 Frame(parent),并将 Swip 事件分派给 ContentView(childview)。 根据Input events overview

    请记住,硬件按键事件总是传递给视图 目前是重点。他们从顶部开始发送 查看层次结构,然后向下,直到它们到达适当的 目的地。

    因此,当您点击 Frame 时,根据您的代码,android 系统认为您想在 ContentView(不存在)上触发点击事件,因为当前焦点是 contentview 而不是框架。因此,如果您有特定的需求,您需要尝试其他方式来实现它。如果没有,请在 ContentView 上注册点击事件。

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2021-09-18
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2021-08-03
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多