Rx で次の問題を解決するための標準的なアプローチは何か疑問に思っています: 2 つのオブザーバブル と がmouse_down
ありmouse_up
、その要素がマウス ボタンの押下を表すとします。非常に単純なシナリオでは、長押しを検出したい場合、次の方法で実行できます (この場合は RxPy を使用しますが、概念的にはどの Rx 実装でも同じです)。
mouse_long_press = mouse_down.delay(1000).take_until(mouse_up).repeat()
mouse_down
ただし、オブザーバブルからオブザーバブルに情報を引き上げる必要がある場合、問題が発生しmouse_up
ます。たとえば、Observable の要素に、どのマウス ボタンが押されたかに関する情報が格納されているとします。明らかに、対応するボタンのみとペアリングmouse_down
したいでしょう。mouse_up
私が思いついた1つの解決策はこれです:
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
ます。このためにmouse_move
、マウスの位置に関する情報を運ぶ新しい observable を導入する必要があります。
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 秒以上押し続けると、ブール値が大量に取得されます。ただし、すべてが false の場合にのみ、長押しを検出したいと考えています。これは、 all 演算子の完璧なケースのように思えます。小さなステップが欠けているだけのように感じますが、これまでのところ、それを機能させる方法を理解できていません。私も逆にやっているのかもしれません。提案をお待ちしております。