android之ListView 内的 PanGestureRecognizer (Xamarin.Forms)

zlslch 阅读:51 2024-02-27 23:08:18 评论:0

我正在 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 
} 

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


标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号