4

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 演算子の完璧なケースのように思えます。小さなステップが欠けているだけのように感じますが、これまでのところ、それを機能させる方法を理解できていません。私も逆にやっているのかもしれません。提案をお待ちしております。

4

2 に答える 2

1

わかりました、私は可能な答えを見つけたと思います。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))
)

誰かがより良い提案を持っている場合に備えて、私は今のところ質問を開いたままにします.

于 2015-04-22T06:06:50.660 に答える