android之ListView 内的 PanGestureRecognizer (Xamarin.Forms)
我正在 Xamarin.Forms(Android 和 iOS)中制作消息传递应用程序。
消息显示在 ListView
中。
现在我想添加一个新功能。当我将消息气球拖到一边时,它会显示消息信息。
用户按住消息,向右或向左拖动。
- 如果他拖得足够多,就会显示一个包含信息的新页面
- 如果他在此“阈值”之前释放,气球将弹回原位。
我尝试在气球上使用 PanGestureRecognizer
(在此上下文中为 PGR)实现此功能,但它部分起作用。
安卓
我可以在阈值之前拖动、释放、释放,而且很管用!但是,如果我在水平拖动的同时垂直拖动,ListView
“窃取”了平移手势,PGR“忘记”了它并且不返回任何事件。所以气球只是保持在那里,稍微偏向一边。
如果我在不向下拖动的情况下松开手指,就不会发生这种情况。
它可能看起来很明显:“当手指被“遗忘”时,你为什么不让它回去呢?”
因为当问题发生时,它不会生成另一个事件。 (并且 ListView
没有 Scrolled
事件作为 ScrollView
)
iOS
当我尝试使用 PGR 时,ListView
不起作用。但是侧拖有效。看起来 PGR 总是先捕获平移手势。
有没有办法让PGR和ListView
同时工作?
请您参考如下方法:
对于 iOS 你可以尝试添加:
Application.Current.On<iOS>().SetPanGestureRecognizerShouldRecognizeSimultaneously(true)
引用文献:https://github.com/xamarin/Xamarin.Forms/issues/2299#issuecomment-399578363 https://learn.microsoft.com/ru-ru/xamarin/xamarin-forms/platform/ios/application-pan-gesture
对于 Android,我用计时器做了一个解决方法:
private System.Threading.Timer timer;
private void PanGesture_PanUpdated(object sender, PanUpdatedEventArgs e)
{
var statusType = e.StatusType;
if (statusType != GestureStatus.Started && timer == null)
{
// after gesture was broken down, next event will be with wrong
// status, like the gesture is continues. So, reset status to Started,
// consider it is new gesture:
statusType = GestureStatus.Started;
}
var slidingView = yourView;
switch (statusType)
{
case GestureStatus.Started:
// do any initializations..
timer = new System.Threading.Timer(_ => {
finishTranslation(slidingView);
});
break;
case GestureStatus.Running:
{
// do any animations..
timer.Change(TimeSpan.FromMilliseconds(100), TimeSpan.Zero);
}
break;
}
}
private void finishTranslation(View slidingView)
{
timer = null;
// finish your animation
}
但是点击手势的问题仍然存在((
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。