@@ -170,6 +170,15 @@ private fun BoxWithConstraintsScope.BaseControlBoxLayout(
170170 val pointerId = change.id
171171 val isPressed = change.pressed
172172
173+ // 抬起时,总是尝试释放该指针下活跃的按钮
174+ // 避免子级占用了指针后,导致按钮状态无法被释放
175+ if (! isPressed) {
176+ allActiveWidgets.remove(pointerId)?.forEach { widget ->
177+ widget.onReleaseEvent(eventHandler, reversedLayers)
178+ }
179+ return @forEach
180+ }
181+
173182 if (
174183 change.isConsumed ||
175184 // 不处理被子级占用的指针
@@ -229,66 +238,60 @@ private fun BoxWithConstraintsScope.BaseControlBoxLayout(
229238
230239 val activeWidgets = allActiveWidgets[pointerId] ? : emptyList()
231240
232- if (isPressed) {
233- // 检查是否移出边界
234- if (activeWidgets.isNotEmpty()) {
235- val backInBounds = mutableListOf<ObservableWidget >()
236- for (widget in activeWidgets) {
237- // 检查组件是否可以响应移除边界即松开
238- if (! widget.isReleaseOnOutOfBounds()) continue
239-
240- val size = widget.internalRenderSize
241- val offset = getWidgetPosition(widget, size, screenSize)
242- val isOutOfBounds = position.x !in offset.x.. (offset.x + size.width) ||
243- position.y !in offset.y.. (offset.y + size.height)
244-
245- if (isOutOfBounds) {
246- widget.onReleaseEvent(eventHandler, reversedLayers)
247- } else {
248- backInBounds.add(widget)
249- }
241+ // 检查是否移出边界
242+ if (activeWidgets.isNotEmpty()) {
243+ val backInBounds = mutableListOf<ObservableWidget >()
244+ for (widget in activeWidgets) {
245+ // 检查组件是否可以响应移除边界即松开
246+ if (! widget.isReleaseOnOutOfBounds()) continue
247+
248+ val size = widget.internalRenderSize
249+ val offset = getWidgetPosition(widget, size, screenSize)
250+ val isOutOfBounds = position.x !in offset.x.. (offset.x + size.width) ||
251+ position.y !in offset.y.. (offset.y + size.height)
252+
253+ if (isOutOfBounds) {
254+ widget.onReleaseEvent(eventHandler, reversedLayers)
255+ } else {
256+ backInBounds.add(widget)
250257 }
251- // fix: 应该在抬起事件全部处理完成后再处理 #941
252- if (backInBounds.isNotEmpty()) {
253- for (widget in backInBounds) {
254- widget.onPointerBackInBounds(eventHandler, reversedLayers)
255- }
258+ }
259+ // fix: 应该在抬起事件全部处理完成后再处理 #941
260+ if ( backInBounds.isNotEmpty() ) {
261+ for (widget in backInBounds) {
262+ widget.onPointerBackInBounds(eventHandler, reversedLayers)
256263 }
257264 }
265+ }
258266
259- when {
260- targetWidgets.isEmpty() -> {}
261- else -> {
262- for (targetWidget in targetWidgets) {
263- if (targetWidget.canProcess()) {
264- return @forEach // 拒绝处理该事件
265- }
267+ when {
268+ targetWidgets.isEmpty() -> {}
269+ else -> {
270+ for (targetWidget in targetWidgets) {
271+ if (targetWidget.canProcess()) {
272+ return @forEach // 拒绝处理该事件
273+ }
266274
267- targetWidget.onTouchEvent(
268- eventHandler = eventHandler,
269- allLayers = reversedLayers,
270- change = change,
271- activeWidgets = activeWidgets,
272- addThis = {
273- allActiveWidgets[pointerId] = activeWidgets + listOf (targetWidget)
274- },
275- consumeEvent = { value ->
276- if (value) {
277- change.consume()
278- } else {
279- // 将指针标记为仅接受滑动处理
280- // 期望子级不对点击事件等进行处理
281- markPointerAsMoveOnly(pointerId)
282- }
275+ targetWidget.onTouchEvent(
276+ eventHandler = eventHandler,
277+ allLayers = reversedLayers,
278+ change = change,
279+ activeWidgets = activeWidgets,
280+ addThis = {
281+ allActiveWidgets[pointerId] = activeWidgets + listOf (targetWidget)
282+ },
283+ consumeEvent = { value ->
284+ if (value) {
285+ change.consume()
286+ } else {
287+ // 将指针标记为仅接受滑动处理
288+ // 期望子级不对点击事件等进行处理
289+ markPointerAsMoveOnly(pointerId)
283290 }
284- )
285- }
291+ }
292+ )
286293 }
287294 }
288- } else {
289- allActiveWidgets.remove(pointerId)?.forEach { widget ->
290- widget.onReleaseEvent(eventHandler, reversedLayers)
291- }
292295 }
293296 }
294297 }
0 commit comments