Я реализовал интерактивный Frame в Xamarin.Forms 2.3.4 с пользовательским FrameRenderer, который установил ClickableLongPressable FWIW) на true, подписался на соответствующие события и установите передний план FrameRenderer

TypedValue typedValue = new TypedValue();
this.Context.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, typedValue, true);
this.Foreground = this.Resources.GetDrawable(typedValue.ResourceId, this.Context.Theme);

Для достижения движения Материала (волнистое касание).

После обновления до XF 2.5 (скорее всего, начиная с 2.3.5, поскольку в этом выпуске были представлены быстрые средства визуализации) мои сенсорные события перестали работать. Мой пользовательский рендерер назначен правильно, как и свойства Clickable и LongPressable, но ничего не происходит. Частично мне удалось обойти проблему - по крайней мере, на данный момент - путем подписки на FrameRenderer.Touch и вызова OnClick из этого обработчика событий. Это делает приложение пригодным для использования, но, к сожалению, ему не хватает визуальной обратной связи в виде эффекта пульсации касания.

Есть ли способ восстановить исходное поведение? Есть ли способ реализовать в XF 2.5 интерактивную рамку с пульсацией касания?

0
Paul Kertscher 20 Ноя 2017 в 13:36

1 ответ

Лучший ответ

С помощью этого ответа я нашел решение. Вот его черновик:

Прежде всего я сохраняю локальную ссылку на свой RippleDrawable (см. документация )

private void SetMaterialMotion()
{
    TypedValue typedValue = new TypedValue();
    this.Context.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, typedValue, true);
    this.Foreground = this.Resources.GetDrawable(typedValue.ResourceId, this.Context.Theme);
    this._layerDrawable = this.Foreground as RippleDrawable;
}

То я должен подписаться на событие Touch

private void SubscribeClickEvent()
{
    if (this.ClickableFrame.IsClickable)
    {
        this.Touch += ClickableFrameRenderer_Touch;
    }
}

В моем ClickableFrameRenderer_Touch я установил свойство Pressed и точку доступа RippleDrawable

private void ClickableFrameRenderer_Touch(object sender, TouchEventArgs e)
{
    if(e.Event.Action == Android.Views.MotionEventActions.Down)
    {
        this.Pressed = true;
    }

    if(e.Event.Action == Android.Views.MotionEventActions.Up)
    {
        this._layerDrawable.SetHotspot(e.Event.GetX(), e.Event.GetY());
        this.Pressed = false;
    }
}

Это покажет пульсирующее движение касания (более или менее), как и ожидалось. Конечно, это пока не работает с долгими нажатиями , но я уже в пути.

Во всяком случае, это решение мне не очень нравится. Я по-прежнему считаю, что должен существовать поддерживаемый способ сделать FastRenderers.FrameRenderer интерактивным. Если кто-то знает это: Поделитесь своими знаниями .

1
Paul Kertscher 20 Ноя 2017 в 11:09