我正在使用Xamarin.Forms(Android和iOS)创建一个消息传递应用程序。
讯息显示在ListView
。
现在我要添加一项新功能。当我将消息气球拖到侧面时,它会显示消息信息。
用户保留信息,向右或向左拖动。
我尝试在气球上使用PanGestureRecognizer
(在此上下文中为PGR)实现此功能,但它部分有效。
我可以在阈值之前拖动,释放,释放,它可以工作!但是如果我在水平拖动的同时垂直拖动,ListView
“窃取”平移手势,PGR“忘记”它并且不会返回任何事件。所以气球只是保持在那里,有点偏向一边。
如果我松开手指而没有拖拽,就不会发生这种情况。
看起来可能很明显:“为什么不在手指被”遗忘“时让它回去?”
因为当问题发生时,它不会生成另一个事件。 (并且ListView
没有Scrolled
的{{1}}事件
当我尝试使用PGR时,ScrollView
不起作用。但是侧面阻力有效。看起来PGR总是首先抓住平移手势。
有没有办法让PGR和ListView
同时工作?
答案 0 :(得分:0)
对于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-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
}
但是点击手势仍然存在问题((