我想知道在 Rx 中解决以下问题的规范方法是什么:假设我有两个 observablesmouse_down
和mouse_up
,其元素代表鼠标按钮按下。在一个非常简单的场景中,如果我想检测长按,我可以通过以下方式进行(在这种情况下使用 RxPy,但在任何 Rx 实现中概念上都是相同的):
mouse_long_press = mouse_down.delay(1000).take_until(mouse_up).repeat()
但是,当我们需要将一些信息从mouse_down
可观察对象提升到可观察对象时,就会出现问题mouse_up
。例如,考虑是否可观察的元素存储了有关按下了哪个鼠标按钮的信息。显然,我们只想mouse_down
与mouse_up
相应的按钮配对。我想出的一个解决方案是:
mouse_long_press = mouse_down.select_many(lambda x:
rx.Observable.just(x).delay(1000)\
.take_until(mouse_up.where(lambda y: x.button == y.button))
)
如果有更直接的解决方案,我很想听听 - 但据我所知,这是可行的。但是,如果我们还想检测鼠标在mouse_down
和之间移动了多远,事情就会变得更加复杂mouse_up
。为此,我们需要引入一个新的 observable mouse_move
,它携带有关鼠标位置的信息。
mouse_long_press = mouse_down.select_many(lambda x:
mouse_move.select(lambda z: distance(x, z) > 100).delay(1000)\
.take_until(mouse_up.where(lambda y: x.button == y.button))
)
但是,这几乎是我卡住的地方。每当一个按钮被按住超过 1 秒时,我都会得到一堆布尔值。但是,我只想在它们全部为假时检测长按,这听起来像是all 运算符的完美案例。感觉好像只少了一小步,但到目前为止我还没有弄清楚如何让它工作。也许我也在以一种倒退的方式做事。期待任何建议。