我正在尝试实现拖放功能。我的用户界面的布局类似于以下内容:
--- --- ---
| 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
基本上会推动或延迟流,而我无法用这些运算符实现我想要的功能。