Xamarin.Forms. Проведите на предыдущую страницу, как Telegram - PullRequest
0 голосов
/ 14 января 2019

Как создать удар на спину?

В iOS:

[assembly: ExportRenderer(typeof(HIPSTO.Controls.CustomContentPage), typeof(HIPSTO.iOS.Platform.Renderers.IOSPageRenderer))]     
namespace HIPSTO.iOS.Platform.Renderers 
{
    public class IOSPageRenderer : PageRenderer        
    {         
      public override void ViewWillAppear(bool animated)            
      {              
        base.ViewWillAppear(animated);

        ViewController.NavigationController.InteractivePopGestureRecognizer.Enabled = true;
        ViewController.NavigationController.InteractivePopGestureRecognizer.Delegate = new UIKit.UIGestureRecognizerDelegate();
       }
    }
}

Но это работает только с края. Это необходимо из любого места. Нет идей с андроидом

Как показано ниже:

enter image description here

1 Ответ

0 голосов
/ 15 января 2019

Во-первых, вы можете достичь NavigationPageRenderer в Android.

Это GIF демо

enter image description here

TransitionNavigationPageRender.cs

[assembly: ExportRenderer(typeof(SwipePageDemo.Controls.TransitionNavigationPage), typeof(TransitionNavigationPageRenderer))]
namespace SwipePageDemo.Droid.Renderers
{
public class TransitionNavigationPageRenderer : NavigationPageRenderer
{


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



    protected override void SetupPageTransition(Android.Support.V4.App.FragmentTransaction transaction, bool isPush)
    {

                if (isPush)
                {

                }
                else
                {
                    transaction.SetCustomAnimations(Resource.Animation.enter_left, Resource.Animation.exit_right,
                                                    Resource.Animation.enter_right, Resource.Animation.exit_left);
                }

    }
}
}

enter_left.xml

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:propertyName="enter_from_left"
  android:shareInterpolator="false">
<translate
  android:fromXDelta="-100%" android:toXDelta="0%"
  android:fromYDelta="0%" android:toYDelta="0%"
  android:duration="300"/>
</set>

enter_right.xml

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
  <translate
     android:fromXDelta="100%" android:toXDelta="0%"
     android:fromYDelta="0%" android:toYDelta="0%"
     android:duration="300" />
</set>

exit_left.xml

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
 <translate
  android:fromXDelta="0%" android:toXDelta="-100%"
  android:fromYDelta="0%" android:toYDelta="0%"
  android:duration="300"/>
</set>

exit_right.xml

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
  android:fromXDelta="0%" android:toXDelta="100%"
  android:fromYDelta="0%" android:toYDelta="0%"
  android:duration="300" />
</set>

Если вы хотите узнать больше информации о Page Transition, вы можете обратиться по этой ссылке. https://github.com/jsuarezruiz/xamarin-forms-page-transitions

Но это работает только с края. Нужно из любого места

Вы можете достичь этого с помощью threshold свойства SwipeGestureRecognizer класса

Класс SwipeGestureRecognizer также включает свойство Threshold , которое может быть дополнительно установлено в значение uint, представляющее минимальное расстояние пролистывания, которое должно быть достигнуто для распознавания пролистывания в независимых от устройства единицах. Значение этого свойства по умолчанию равно 100, что означает, что любые свипы, которые меньше 100 независимых от устройства, будут игнорироваться. Если вы хотите увеличить площадь, которую можно провести, вы можете уменьшить эти данные Threshold, как показано в следующем коде.

        var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
        leftSwipeGesture.Threshold = 50;
        leftSwipeGesture.Swiped += (sender, e) => Navigation.PopAsync();
       stackLayout.GestureRecognizers.Add(leftSwipeGesture);

Я изменил значение leftSwipeGesture. Порог на 50, это GIF удара. enter image description here

...