我正在尝试在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]
))
;
}
我现在通过将整个事情包装到另一个可观察对象中来解决它。
我使用了一个设置为在拖动开始事件时true
并在拖动停止事件时设置为false
BehaviourSubject<bool> isDragActiveSource
。
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));
})
当行为主体发出false
firstTouch
并且secondTouch
观察量完成(takeUntil
(时,当它再次变得true
时,它们被重新创建。