سؤال

أحاول اكتشاف إيماءة التمرير الأفقية باستخدام GestureRecognizer عن طريق التوصيل بـ انزلاق متقاطع حدث.

        _gr = new GestureRecognizer
        {
            GestureSettings = GestureSettings.ManipulationTranslateX |
                              GestureSettings.ManipulationTranslateY |
                              GestureSettings.CrossSlide
        };

        _gr.CrossSliding += OnSwipe;
        _gr.ManipulationStarted += OnManipulationStarted;
        _gr.ManipulationUpdated += OnManipulationUpdated;
        _gr.ManipulationCompleted += OnManipulationCompleted;

        _gr.CrossSlideHorizontally = true;

كما ترون من الكود أعلاه، لا ينبغي اكتشاف السحب فحسب، بل يجب أيضًا اكتشاف إيماءات السحب.

مشكلتي هي أنني لا أستطيع تخصيص إيماءة التمرير السريع.

أرغب في تخصيص الحد الأدنى للسرعة والمسافة التي يتعين على المستخدم سحب المؤشر قبل اعتبار الإيماءة تمريرة سريعة.في الحالة الحالية، حتى أبطأ وأصغر حركة سحب أفقية ستؤدي إلى تشغيل CrossSliding حدث.

رأيت عتبات CrossSlide فئة تسمح بتخصيص الإيماءة، ولكن لم أتمكن من رؤية كيف يمكن استخدامها لتكوين سرعة ومسافة إيماءة السحب.

هل CrossSliding الحدث الطريقة الصحيحة للكشف عن انتقاد؟إذا كان الأمر كذلك، كيف يمكنني تكوين السرعة ومسافة التمرير؟

إذا لم يكن الأمر كذلك، فكيف يمكنني اكتشاف إيماءة التمرير؟

هل كانت مفيدة؟

المحلول

لم أتمكن من العثور على أي طريقة مدمجة لاكتشاف التمرير السريع، لذلك قمت بتطبيق طريقة الكشف الخاصة بي.

يكتشف الرمز تمريرًا أفقيًا.

الأساليب الموضحة هي معالجات الأحداث لـ GestureRecognizer الأحداث:

readonly Stopwatch _manipulationTimer = new Stopwatch();

public void OnManipulationStarted(ManipulationStartedEventArgs e)
{
    _manipulationTimer.Restart();
}

public void OnManipulationCompleted(ManipulationCompletedEventArgs e)
{
    var millis = _manipulationTimer.ElapsedMilliseconds;

    if (Math.Abs(e.Cumulative.Translation.Y) < MaxVerticalSwipeDistanceInPix &&
        Math.Abs(e.Cumulative.Translation.X) > MinHorizontalSwipeDistanceInPix && 
        millis > MinSwipeDurationInMillis && 
        millis < MaxSwipeDurationInMillis && 
        Math.Abs(e.Cumulative.Scale - 1) < 0.01 // 1 touch point 
        )
    { 
        var leftSwipe = e.Cumulative.Translation.X < 0;
        if (leftSwipe)
        {
        }
        else // right swipe
        {               
        }
    }

    _manipulationTimer.Stop();
    _manipulationTimer.Reset();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top