ListView中的PanGestureRecognizer(Xamarin.Forms)

时间:2018-02-08 15:34:31

标签: android ios listview xamarin.forms uipangesturerecognizer

我正在使用Xamarin.Forms(Android和iOS)创建一个消息传递应用程序。

讯息显示在ListView

现在我要添加一项新功能。当我将消息气球拖到侧面时,它会显示消息信息。

用户保留信息,向右或向左拖动。

  • 如果他拖得足够,新信息页会显示
  • 如果他在此“阈值”之前释放,则气球会反弹回原位

我尝试在气球上使用PanGestureRecognizer(在此上下文中为PGR)实现此功能,但它部分有效。

的Android

我可以在阈值之前拖动,释放,释放,它可以工作!但是如果我在水平拖动的同时垂直拖动,ListView“窃取”平移手势,PGR“忘记”它并且不会返回任何事件。所以气球只是保持在那里,有点偏向一边。

Intially - 初始状态。

Dragging right - 将消息拖到右侧

Already released - 我已经发布了这条消息,但它仍然在右边。

如果我松开手指而没有拖拽,就不会发生这种情况。

看起来可能很明显:“为什么不在手指被”遗忘“时让它回去?
因为当问题发生时,它不会生成另一个事件。 (并且ListView没有Scrolled的{​​{1}}事件

的iOS

当我尝试使用PGR时,ScrollView不起作用。但是侧面阻力有效。看起来PGR总是首先抓住平移手势。

有没有办法让PGR和ListView同时工作?

1 个答案:

答案 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
}

但是点击手势仍然存在问题((