我正在尝试实现拖放功能。我的 UI 布局如下所示:
--- --- ---
| 1 | 2 | |
--- --- 5 |
| 3 | 4 | |
--- --- ---
框 1、2、3 和 4 是图像,当用户选择时,框周围会有一个白色边框。此选择操作使用 执行left press
。
方框 5 显示了所选图像的一些基本信息。
框 1、2、3 和 4 中的图像可以拖放到框 5 中。成功拖放后,丢弃图像的缩略图也会显示在框 5 中。
执行使用RxPy
. 我的拖放代码如下所示:
drag_start = self.viewer.events \
.filter(lambda ev: ev.type == MouseEventType.LeftPress)
drag_move = self.viewer.events \
.filter(lambda ev: ev.type == MouseEventType.MouseMove)
drag = drag_start \
.flat_map(lambda ev: \
drag_move \
.first()
)
drag.subscribe(lambda ev: self.start_drag())
# and yes, i do not have a takeUntil mouse release event in my stream. this is done intentionally.
我start_drag
在光标移动的任何地方都实现了一个缩略图。我已将这部分代码省略了,因为它不是我面临的问题的重点。
我遇到的问题是这个。如果我要选择一个图像,无论我做了多少mouse move
,start_drag
都会被解雇并创建缩略图。如果mouse move
事件发生在上一次之后的某个时间范围之后left press
,则不应将其视为拖动事件并且不会触发start_drag
。相反,“即时” left press
+mouse move
事件将被视为拖动事件
应该将什么添加到我的事件流中,以便我能够确定left press
和mouse move
事件之间的持续时间?随后,如果此持续时间超过时间范围,我将忽略而不开火start_drag
。还是有更好的解决方案来解决这个问题?
delay
,debounce
基本上要么推动或延迟流,我无法通过这些运营商实现我想要的。