gpt4 book ai didi

reactive-programming - ReactiveX (Rx) - 检测长按事件

转载 作者:行者123 更新时间:2023-12-04 08:22:39 27 4
gpt4 key购买 nike

我想知道在 Rx 中解决以下问题的规范方法是什么:假设我有两个可观察对象,mouse_downmouse_up ,其元素表示鼠标按钮按下。在一个非常简单的场景中,如果我想检测长按,我可以通过以下方式进行(在这种情况下使用 RxPy,但在任何 Rx 实现中概念上都相同):

mouse_long_press = mouse_down.delay(1000).take_until(mouse_up).repeat()

但是,当我们需要从 mouse_down 中提升一些信息时就会出现问题。可观察到 mouse_up可观察的。例如,考虑 observable 的元素是否存储了有关按下哪个鼠标按钮的信息。显然,我们只想配对 mouse_downmouse_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 秒时,我就会得到一堆 bool 值。但是,我只想在所有这些都为假时检测长按,这听起来是 all operator 的完美案例。 .感觉好像只缺少了一小步,但到目前为止我还没有弄清楚如何使它工作。或许我也是在逆向做事。期待任何建议。

最佳答案

好的,我想我找到了可能的答案。 RxPy 有一个 take_with_time操作符,用于此目的。并不像我希望的那么直接(不确定 take_with_time 在其他 Rx 实现中是否可用)。

mouse_long_press = mouse_down.select_many(lambda x:
mouse_moves.take_with_time(1000).all(lambda z: distance(x, z) < 100)\
.take_until(mouse_up.where(lambda y: x.button == y.button))
)

如果有人有更好的建议,我将暂时保留这个问题。

关于reactive-programming - ReactiveX (Rx) - 检测长按事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29787395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com