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
firstTouch
和 secondTouch
Observables 完成时 (takeUntil
) 并且当它再次变为 true
时,它们将被重新创建.
我正在尝试在 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
firstTouch
和 secondTouch
Observables 完成时 (takeUntil
) 并且当它再次变为 true
时,它们将被重新创建.