C# reactiveX 多点触控在 OnPointerUp 事件上拖动清除缓冲区

C# reactiveX multitouch drag clear buffer on OnPointerUp Event

我正在尝试在 unirx 中实现多点触控拖动以实现统一。我使用 Buffer(count, skip) 重载获取每个手指的最后一个事件并计算距离。

我现在想在手指抬起时清除缓冲区,否则缓冲区中的旧值会产生很大的增量。

 private IObservable<TwoFingerDragEventData> CalculateDelta(IObservable<PointerEventData> dragEvent, int pointerId) {

    return dragEvent
      .Where(data => data.pointerId == pointerId)
      .Select(data => data.position)
      .Buffer(2, 1)
      .Select((IList<Vector2> list) => new TwoFingerDragEventData(
        Vector2.Distance(list[0], list[1]),
        list[1] - list[0]
      ))
    ;
  }

我现在通过将整个事情包装到另一个 observable 中解决了它。

我使用 BehaviourSubject<bool> isDragActiveSource,在拖动开始事件上设置为 true,在拖动停止事件上设置为 false

isDragActiveSource
  .AsObservable()
  .Where(isActive => isActive == true)
  .SelectMany((bool _) => {
    IObservable<TwoFingerDragEventData> firstTouch = CalculateDelta(onDrag, 0);
    IObservable<TwoFingerDragEventData> secondTouch = CalculateDelta(onDrag, 1);

    return firstTouch.Zip(
      secondTouch,
      (TwoFingerDragEventData left, TwoFingerDragEventData right) => TwoFingerDragEventData.Avg(left, right
    ).TakeUntil(isDragActive.Where(isActive => isActive == false));
  })

当 BehaviourSubject 发出 false firstTouchsecondTouch Observables 完成时 (takeUntil) 并且当它再次变为 true 时,它们将被重新创建.