如何将带有波纹触摸的可点击框架迁移到 Xamarin.Forms 2.5?
How to migrate a clickable Frame with ripple touch to Xamarin.Forms 2.5?
我在 Xamarin.Forms 2.3.4 中实现了一个可点击的 Frame
,其中自定义 FrameRenderer
将 Clickable
(和 LongPressable
FWIW)设置为 true
, 订阅各自的事件并设置 FrameRenderer
s 前台
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 开始,因为该版本引入了快速渲染器)我的触摸事件已停止工作。我的自定义渲染器已正确分配,Clickable
和 LongPressable
属性也已正确分配,但没有任何反应。通过订阅 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
可点击。如果有人知道:请分享您的知识。
我在 Xamarin.Forms 2.3.4 中实现了一个可点击的 Frame
,其中自定义 FrameRenderer
将 Clickable
(和 LongPressable
FWIW)设置为 true
, 订阅各自的事件并设置 FrameRenderer
s 前台
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 开始,因为该版本引入了快速渲染器)我的触摸事件已停止工作。我的自定义渲染器已正确分配,Clickable
和 LongPressable
属性也已正确分配,但没有任何反应。通过订阅 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
可点击。如果有人知道:请分享您的知识。