Skip to content

Commit 1931001

Browse files
committed
fix: 指针抬起时释放活跃组件 & 指针占用逻辑
1 parent c34f476 commit 1931001

2 files changed

Lines changed: 57 additions & 54 deletions

File tree

  • LayerController/src/main/java/com/movtery/layer_controller
  • ZalithLauncher/src/main/java/com/movtery/zalithlauncher/ui/control/mouse

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

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

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/ui/control/mouse/TouchInput.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ fun TouchpadLayout(
164164
val isMoveOnly = isMoveOnlyPointer(pointerId)
165165

166166
//仅在未被父级消费且未被占用的情况下,尝试占用指针
167-
if (!isMoveOnly && !change.isConsumed && pointerId !in occupiedPointers) {
167+
if (!change.isConsumed && pointerId !in occupiedPointers) {
168168
onOccupiedPointer(pointerId)
169169
occupiedPointers.add(pointerId)
170170
}
@@ -290,7 +290,7 @@ fun TouchpadLayout(
290290
activePointer = null
291291
}
292292

293-
if (!isMoveOnly && pointerId in occupiedPointers) {
293+
if (pointerId in occupiedPointers) {
294294
occupiedPointers.remove(pointerId)
295295
onReleasePointer(pointerId)
296296
}

0 commit comments

Comments
 (0)