Как отключить свайп влево и включить свайп вправо в xamarin android

#android #xamarin.android

#Android #xamarin.android

Вопрос:

У меня есть viewpager с 3 фрагментами. Во втором фрагменте у меня есть кнопка. В настоящее время свайп происходит как влево, так и вправо для всех 3 фрагментов. Теперь во втором фрагменте только после нажатия на кнопку пользователь должен иметь возможность перейти к третьему экрану. В противном случае свайп со второго экрана на третий должен быть заблокирован. Когда пользователь переходит к третьему экрану, он может вернуться к предыдущим экранам. Я написал код customviewpager, но он не работает для блокировки определенного свайпа. Пожалуйста, помогите мне с этой проблемой.

 CustomViewPager.cs

namespace swiping
{
    public class CustomViewPager : ViewPager
    {
        private float initialXValue;
        private SwipeDirection direction;
        private int position = 0;
        CustomViewPager myadapter;

        bool isrightswipe, isleftswipe;

        public bool ShouldAllowSwipe()
        {

            if (this.CurrentItem == 1 amp;amp; isleftswipe == true)
            {

                return false;
            }

            return true;

        }



        public CustomViewPager(Context context, IAttributeSet attrs) : base(context, attrs)
        {

            //this.direction = SwipeDirection.all;

        }

        public override bool OnTouchEvent(MotionEvent e)
        {
            //base.OnTouchEvent(e);

            //if (this.IsSwipeAllowed(e))
            //{
            //  return base.OnTouchEvent(e);
            //}

            IsSwipeAllowed(e);
            if (ShouldAllowSwipe())
            {
                base.OnTouchEvent(e);
                return true;
            }





            return false;
        }





        public override bool OnInterceptTouchEvent(MotionEvent e)
        {

            if (this.IsSwipeAllowed(e))
            {
                return base.OnInterceptTouchEvent(e);
            }

            return false;
        }

        private bool IsSwipeAllowed(MotionEvent e)
        {
            //if (this.direction == SwipeDirection.all) return true;

            //if (direction == SwipeDirection.none)//disable any swipe
            //return false;

            isrightswipe = false;
            isleftswipe = false;

            if (e.Action == MotionEventActions.Down)
            {
                initialXValue = e.GetX();

            }

            if (e.Action == MotionEventActions.Move)
            {
                try
                {
                    float diffX = e.GetX() - initialXValue;
                    if (diffX > 0 amp;amp; direction == SwipeDirection.right)
                    {
                        // swipe from left to right detected
                        //prev
                        isleftswipe = false;
                        isrightswipe = true;
                        return false;
                    }
                    else if (diffX < 0 amp;amp; direction == SwipeDirection.left)
                    {
                        // swipe from right to left detected
                        //next
                        isleftswipe = true;
                        isrightswipe = false;
                        return false;
                    }
                }
                catch (Exception ex)
                {

                }
            }

            return true;
        }

        public void setAllowedSwipeDirection(SwipeDirection direction)
        {
            this.direction = direction;
        }

    }


    public enum SwipeDirection
    {
        all, left, right, none
    }
} 
  

Ответ №1:

Я переработал ваш код и завершил решение.

 using System;
using Android.Content;
using Android.Runtime;
using Android.Support.V4.View;
using Android.Util;
using Android.Views;

namespace Android.Base
{
    [Register("ViewPagerWithCustomSwipe")]
    public class ViewPagerWithCustomSwipe : ViewPager
    {
        private float InitialX;
        private SwipeDirection DisabledSwipeDirection;

        public ViewPagerWithCustomSwipe(Context context, IAttributeSet attrs) : base(context, attrs)
        {
        }

        protected ViewPagerWithCustomSwipe(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {
        }

        public ViewPagerWithCustomSwipe(Context context) : base(context)
        {
        }

        public override bool OnTouchEvent(MotionEvent e)
        {
            if (IsSwipeAllowed(e))
                return base.OnTouchEvent(e);

            return false;
        }

        public override bool OnInterceptTouchEvent(MotionEvent e)
        {
            if (IsSwipeAllowed(e))
                return base.OnInterceptTouchEvent(e);

            return false;
        }

        private bool IsSwipeAllowed(MotionEvent e)
        {
            if (DisabledSwipeDirection == SwipeDirection.All)
                return false;

            if (DisabledSwipeDirection == SwipeDirection.None)
                return true;

            if (e.Action == MotionEventActions.Down)
                InitialX = e.GetX();

            if (e.Action == MotionEventActions.Move)
            {
                float diffX = e.GetX() - InitialX;
                if (diffX > 0 amp;amp; DisabledSwipeDirection == SwipeDirection.Right)
                    return false;

                else if (diffX < 0 amp;amp; DisabledSwipeDirection == SwipeDirection.Left)
                    return false;
            }

            return true;
        }

        public void DisableSwipe(SwipeDirection direction)
        {
            DisabledSwipeDirection = direction;
        }
    }

    public enum SwipeDirection
    {
        All = 0,
        Left = 1,
        Right = 2,
        None = 3
    }
}
  

Вам нужно использовать control и добавить к нему OnPageChangeListener. В custom page listener вы можете реализовать свою собственную логику с отключением свайпа.

Как это использовать, вы можете посмотреть на моем github: https://gist.github.com/IlyaLavrov97/4bf2fb11ea195a0bbbaa2276a1a6c586

Счастливого кодирования! 🙂