@@ -236,62 +236,67 @@ private fun BoxWithConstraintsScope.BaseControlBoxLayout(
236236 }
237237 }
238238
239- val activeWidgets = allActiveWidgets[pointerId] ? : emptyList()
240-
241- if (isPressed) {
242- // 检查是否移出边界
243- if (activeWidgets.isNotEmpty()) {
244- val backInBounds = mutableListOf<ObservableWidget >()
245- for (widget in activeWidgets) {
246- // 检查组件是否可以响应移除边界即松开
247- if (! widget.isReleaseOnOutOfBounds()) continue
248-
249- val size = widget.internalRenderSize
250- val offset = getWidgetPosition(widget, size, screenSize)
251- val isOutOfBounds = position.x !in offset.x.. (offset.x + size.width) ||
252- position.y !in offset.y.. (offset.y + size.height)
253-
254- if (isOutOfBounds) {
255- widget.onReleaseEvent(eventHandler, reversedLayers)
256- } else {
257- backInBounds.add(widget)
258- }
239+ var activeWidgets = allActiveWidgets[pointerId] ? : emptyList()
240+
241+ // 检查是否移出边界
242+ if (activeWidgets.isNotEmpty()) {
243+ val backInBounds = mutableListOf< ObservableWidget >()
244+ val releasedWidgets = mutableListOf<ObservableWidget >()
245+ for (widget in activeWidgets) {
246+ // 检查组件是否可以响应移除边界即松开
247+ if (! widget.isReleaseOnOutOfBounds()) continue
248+
249+ val size = widget.internalRenderSize
250+ val offset = getWidgetPosition(widget, size, screenSize)
251+ val isOutOfBounds = position.x !in offset.x.. (offset.x + size.width) ||
252+ position.y !in offset.y.. (offset.y + size.height)
253+
254+ if (isOutOfBounds) {
255+ widget.onReleaseEvent(eventHandler, reversedLayers)
256+ releasedWidgets.add(widget)
257+ } else {
258+ backInBounds.add(widget)
259259 }
260- // fix: 应该在抬起事件全部处理完成后再处理 #941
261- if (backInBounds.isNotEmpty()) {
262- for (widget in backInBounds) {
263- widget.onPointerBackInBounds(eventHandler, reversedLayers)
264- }
260+ }
261+ // fix: 移出边界时应移出组,否则滑动回已释放的按钮无法再次触发
262+ if (releasedWidgets.isNotEmpty()) {
263+ activeWidgets = activeWidgets - releasedWidgets
264+ allActiveWidgets[pointerId] = activeWidgets
265+ }
266+ // fix: 应该在抬起事件全部处理完成后再处理 #941
267+ if (backInBounds.isNotEmpty()) {
268+ for (widget in backInBounds) {
269+ widget.onPointerBackInBounds(eventHandler, reversedLayers)
265270 }
266271 }
272+ }
267273
268- when {
269- targetWidgets.isEmpty() -> {}
270- else -> {
271- for (targetWidget in targetWidgets) {
272- if (targetWidget.canProcess()) {
273- return @forEach // 拒绝处理该事件
274- }
274+ when {
275+ targetWidgets.isEmpty() -> {}
276+ else -> {
277+ for (targetWidget in targetWidgets) {
278+ if (targetWidget.canProcess()) {
279+ return @forEach // 拒绝处理该事件
280+ }
275281
276- targetWidget.onTouchEvent(
277- eventHandler = eventHandler,
278- allLayers = reversedLayers,
279- change = change,
280- activeWidgets = activeWidgets,
281- addThis = {
282- allActiveWidgets[pointerId] = activeWidgets + listOf (targetWidget)
283- },
284- consumeEvent = { value ->
285- if (value) {
286- change.consume()
287- } else {
288- // 将指针标记为仅接受滑动处理
289- // 期望子级不对点击事件等进行处理
290- markPointerAsMoveOnly(pointerId)
291- }
282+ targetWidget.onTouchEvent(
283+ eventHandler = eventHandler,
284+ allLayers = reversedLayers,
285+ change = change,
286+ activeWidgets = activeWidgets,
287+ addThis = {
288+ allActiveWidgets[pointerId] = activeWidgets + listOf (targetWidget)
289+ },
290+ consumeEvent = { value ->
291+ if (value) {
292+ change.consume()
293+ } else {
294+ // 将指针标记为仅接受滑动处理
295+ // 期望子级不对点击事件等进行处理
296+ markPointerAsMoveOnly(pointerId)
292297 }
293- )
294- }
298+ }
299+ )
295300 }
296301 }
297302 }
0 commit comments