如何获得发生的每个pann手势

时间:2017-06-09 15:06:09

标签: xamarin.forms swipe slide pan

我有一个非常简单的问题,但我找不到任何答案。

我有一个应用程序,我希望每次发生平移/滑动/滑动手势时都会调用一个函数。

我知道布局是如何组织的,所以这意味着我无法在主布局上添加手势,但与此同时,将此手势添加到每个元素似乎令人毛骨悚然...

有什么想法吗?

感谢

2 个答案:

答案 0 :(得分:0)

制作自定义页面渲染器并在那里添加手势。

这是iOS上的一个例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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

[assembly: ExportRenderer(typeof(SearchEventsPage), typeof(SearchEventsPageRenderer))]

namespace Knok.iOS
{
    class SearchEventsPageRenderer : PageRenderer
    {
        UISwipeGestureRecognizer swipeLeftGestureRecognizer, swipeRightGestureRecognizer;

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null) 
            {
                if (swipeLeftGestureRecognizer != null)
                    NativeView.RemoveGestureRecognizer(swipeLeftGestureRecognizer);
                if (swipeRightGestureRecognizer != null)
                    NativeView.RemoveGestureRecognizer(swipeRightGestureRecognizer);
            }

            if (e.NewElement != null)
            {

                swipeLeftGestureRecognizer = new UISwipeGestureRecognizer(_ => 
                    {
                        ((SearchEventsPage)Element).OnSwipeLeft();
                    })
                {
                    Direction = UISwipeGestureRecognizerDirection.Left
                };
                NativeView.AddGestureRecognizer(swipeLeftGestureRecognizer);

                swipeRightGestureRecognizer = new UISwipeGestureRecognizer(() =>
                    {
                        ((SearchEventsPage)Element).OnSwipeRight();
                    })
                {
                    Direction = UISwipeGestureRecognizerDirection.Right
                };
                NativeView.AddGestureRecognizer(swipeRightGestureRecognizer);
            }
        }


    }
}

其中OnSwipeLeft和OnSwipeRight在SearchEventsPage中定义为

public async void OnSwipeLeft()
{
}

答案 1 :(得分:0)

我找到了一些不那么糟糕的东西,它也可以引发一个事件或调用给定的Action<>

public class PanContainer : ContentView
{
    private double x, y;

    public PanContainer()
    {
        var panGesture = new PanGestureRecognizer();
        panGesture.PanUpdated += OnPanUpdated;
        GestureRecognizers.Add(panGesture);
        BackgroundColor = Color.Transparent;
    }

    private double valueX;
    private double valueY;

    private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {
        if (e.TotalX == 0 && e.TotalX != valueX)
            Debug.WriteLine("The X pan value is [{0}]", valueX);
        valueX = e.TotalX;
        if (e.TotalY == 0 && e.TotalY != valueX)
            Debug.WriteLine("The Y pan value is [{0}]", valueY);
        valueY = e.TotalY;
    }
}

就像使用它一样

<ContentPage.Content>
    <AbsoluteLayout BackgroundColor="Black">
        <component:PanContainer AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1" AbsoluteLayout.LayoutFlags="All">

        </component:PanContainer>
    </AbsoluteLayout>
</ContentPage.Content>

并且不要忘记包含xmlns:component="clr-namespace:NAMESPACE.Sources.Components;assembly=NightLine"

如果您想举办活动或致电某项活动,请从private void OnPanUpdated(object sender, PanUpdatedEventArgs e) { .. }

进行