繁体   English   中英

ListView (Xamarin.Forms) 内的 PanGestureRecognizer

[英]PanGestureRecognizer inside ListView (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://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM