我在Xamarin.Forms 2.3.4中实现了一个可点击的Frame
,其自定义FrameRenderer
将Clickable
(以及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开始,因为快速渲染器已经在该版本中引入),我的触摸事件已经停止工作。我的自定义渲染器分配正确,Clickable
和LongPressable
属性也是如此,但没有任何反应。部分我已经能够通过订阅FrameRenderer.Touch
并从该事件处理程序调用{{1}}来解决该问题 - 至少目前是这样。这使应用程序可用,但不幸的是缺乏波纹触摸效果形式的视觉反馈。
有什么方法可以恢复原来的行为吗?有没有办法在XF 2.5中实现带有波纹触摸的可点击框架?
答案 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
可点击。如果有人知道:请分享您的知识。