Xamarin.Forms салфетки распознавания жестов

Xamarin.Forms очень новый и очень захватывающий, но на данный момент я вижу, что он имеет ограниченную документацию и несколько образцов. Я пытаюсь создать приложение с интерфейсом, похожим на "MasterDetailPage", но также иметь правое представление Flyout, а не только левое.

Я видел, что это невозможно с использованием текущего API, поэтому мой подход:

  • Создайте общий интерфейс GestureRecognizer.
  • В Android-приложении и iOS свяжите этот интерфейс с UIGestureRecognizer на iOS или с методом OnTouch на Android.

Для iOS это работает, но для Android сенсорный прослушиватель по активности, похоже, не работает.

Хороший ли мой подход? Может быть, есть еще один хороший способ захвата событий касания непосредственно из общего кода? Или у вас есть идеи, почему public override bool OnTouchEvent не работает в AndroidActivity?

Ответы

Ответ 1

MasterDetailPage и другие общие элементы - это просто контейнеры для визуализации рендеринга. Лучше всего было бы создать пользовательский LRMasterDetailPage (слева направо) и дать ему свойства как для DetailLeft, так и для DetailRight. Затем вы создаете пользовательский ViewRenderer для платформы для этого настраиваемого элемента.

Элемент:

public class LRMasterDetailPage {
    public View LeftDetail;
    public View RightDetail;
    public View Master;
}

Средство рендеринга:

[assembly:ExportRenderer (typeof(LRMasterDetailPage), typeof(LRMDPRenderer))]
namespace App.iOS.Renderers
{
    public class LRMDPRenderer : ViewRenderer<LRMasterDetailPage,UIView>
    {
        LRMasterDetailPage element;

        protected override void OnElementChanged (ElementChangedEventArgs<LRMasterDetailPage> e)
        {
            base.OnElementChanged (e);
            element = e.NewElement;
            // Do someting else, init for example
        }

        protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Renderer")
                    return;
            base.OnElementPropertyChanged (sender, e);

            if (e.PropertyName == "LeftDetail")
                updateLeft();

            if (e.PropertyName == "RightDetail")
                updateRight();
        }

        private void updateLeft(){
            // Insert view of DetailLeft element into subview
            // Add button to open Detail to parent navbar, if not yet there
            // Add gesture recognizer for left swipe
        }
        private void updateRight(){
            // same as for left, but flipped
        }
    }
}

Ответ 2

Советую вам использовать подход CarouselView, т.е. вы можете использовать уже существующие решения с карусельным представлением, которые поддерживают жесты жесты. Таким образом, ваше представление будет включено в этот контроль над каруселями.