[英]PanGestureRecognizer inside ListView (Xamarin.Forms)
我正在 Xamarin.Forms(Android 和 iOS)中制作一个消息传递应用程序。
消息显示在ListView
。
现在我想添加一个新功能。 当我将消息气球拖到一边时,它会显示消息信息。
用户按住消息,向右或向左拖动。
我尝试在气球上使用PanGestureRecognizer
(在此上下文中为 PGR)来实现它,但它部分工作。
我可以在阈值之前拖动,释放,释放,并且有效! 但是如果我在水平拖动的同时垂直拖动, ListView
“窃取”平移手势,PGR“忘记”它并且不返回任何事件。 所以气球只是保持在那里,稍微偏向一边。
如果我在不向下拖动的情况下松开手指,则不会发生这种情况。
这可能看起来很明显:“当手指被“遗忘”时,你为什么不让它回去? ”
因为当问题发生时,它不会生成另一个事件。 (并且ListView
没有Scrolled
事件作为ScrollView
)
当我尝试使用 PGR 时, ListView
不起作用。 但侧拖有效。 看起来 PGR 总是首先抓住平移手势。
有没有办法让 PGR 和ListView
同时工作?
对于 iOS,您可以尝试添加:
Application.Current.On<iOS>().SetPanGestureRecognizerShouldRecognizeSimultaneously(true)
参考资料: https : //github.com/xamarin/Xamarin.Forms/issues/2299#issuecomment-399578363 https://docs.microsoft.com/ru-ru/xamarin/xamarin-forms/platform/ios/application-pan -手势
对于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
}
但是点击手势的问题仍然在这里((
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.