如何将带有波纹触摸的可点击框架迁移到 Xamarin.Forms 2.5?

How to migrate a clickable Frame with ripple touch to Xamarin.Forms 2.5?

我在 Xamarin.Forms 2.3.4 中实现了一个可点击的 Frame,其中自定义 FrameRendererClickable(和 LongPressable FWIW)设置为 true, 订阅各自的事件并设置 FrameRenderers 前台

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

实现Material运动(波纹触摸)。

更新到 XF 2.5 后(最有可能从 2.3.5 开始,因为该版本引入了快速渲染器)我的触摸事件已停止工作。我的自定义渲染器已正确分配,ClickableLongPressable 属性也已正确分配,但没有任何反应。通过订阅 FrameRenderer.Touch 并从该事件处理程序调用 OnClick,我已经部分地解决了这个问题 - 至少目前是这样。这使应用程序可用,但不幸的是缺少波纹触摸效果形式的视觉反馈。

有什么方法可以恢复原来的行为吗?有没有办法在 XF 2.5 中实现带波纹触摸的可点击框架?

的帮助下,我找到了解决方案。这是它的草稿:

首先,我存储了对 RippleDrawable 的本地引用(参见 documentation

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 可点击。如果有人知道:请分享您的知识