Skip to content

Commit a2b99ec

Browse files
authored
Merge pull request #1252 from ZalithLauncher/fix/control_pointer_conflict#1
fix(控制布局): 可滑动控件多指触控问题
2 parents 40fb742 + b27b758 commit a2b99ec

1 file changed

Lines changed: 55 additions & 50 deletions

File tree

  • LayerController/src/main/java/com/movtery/layer_controller

LayerController/src/main/java/com/movtery/layer_controller/Layout.kt

Lines changed: 55 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)