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

时间:2017-11-20 10:36:31

标签: xamarin.forms xamarin.android android-cardview custom-renderer

我在Xamarin.Forms 2.3.4中实现了一个可点击的Frame,其自定义FrameRendererClickable(以及LongPressable 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开始,因为快速渲染器已经在该版本中引入),我的触摸事件已经停止工作。我的自定义渲染器分配正确,ClickableLongPressable属性也是如此,但没有任何反应。部分我已经能够通过订阅FrameRenderer.Touch并从该事件处理程序调用{​​{1}}来解决该问题 - 至少目前是这样。这使应用程序可用,但不幸的是缺乏波纹触摸效果形式的视觉反馈。

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

1 个答案:

答案 0 :(得分:1)

this answer的帮助下,我找到了一个解决方案。这是草稿:

首先,我存储了对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可点击。如果有人知道:请分享您的知识