Когда пузырь наложения перетаскивается из позиции A в позицию B, а затем первый раз щелкается в позиции B, он ненадолго дает сбой или телепортируется обратно в позицию A, прежде чем возврат в позицию B. Это происходит только при первом клике после перехода на новую позицию.
Среда:
- Android Studio Божья коровка | 2024.2.1 Патч 2
- Составить версию: «2024.04.01
- Протестировано на:
- Android 14 (где возникает проблема)
- Android 13 и более ранних версий (работает правильно)
Код: Выделить всё
class FloatingBubbleService : Service() {
private lateinit var windowManager: WindowManager
private var bubbleView: ComposeView? = null
private val params = WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
PixelFormat.TRANSLUCENT
)
private fun setupFloatingBubble() {
bubbleView = ComposeView(this).apply {
setViewTreeLifecycleOwner(viewOwner)
setViewTreeSavedStateRegistryOwner(viewOwner)
var initialX = 0
var initialY = 0
var initialTouchX = 0f
var initialTouchY = 0f
var isDragging = false
setContent {
var isMenuVisible by remember { mutableStateOf(false) }
FloatingBubbleTheme {
FloatingBubbleContent(
isMenuVisible = isMenuVisible,
onBubbleClick = { /* Not needed */ },
interceptTouchEvents = false
)
}
setOnTouchListener { view, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
isDragging = false
initialX = params.x
initialY = params.y
initialTouchX = event.rawX
initialTouchY = event.rawY
true
}
MotionEvent.ACTION_MOVE -> {
if (!isDragging && (Math.abs(event.rawX - initialTouchX) > 10 ||
Math.abs(event.rawY - initialTouchY) > 10)) {
isDragging = true
}
if (isDragging) {
val newX = initialX + (event.rawX - initialTouchX).toInt()
val newY = initialY + (event.rawY - initialTouchY).toInt()
params.x = newX
params.y = newY
windowManager.updateViewLayout(view, params)
}
true
}
MotionEvent.ACTION_UP -> {
if (!isDragging) {
isMenuVisible = !isMenuVisible
}
true
}
else -> false
}
}
}
}
}
}
Пузырь наложения должен оставаться в положении B при нажатии без каких-либо сбоев в положении.
Фактическое поведение на Android 14:
- Перетащите пузырь наложения из положения A в положение B
< li>Нажмите пузырь в позиции B - Пузырь ненадолго возвращается в положение A
- Пузырь возвращается в положение B
- Различные комбинации флагов WindowManager.LayoutParams
- Проверка обновлений позиции в onDraw
- Проверка касания координаты и параметры окна
Известна ли это проблема с WindowManager в Android 14? Существуют ли какие-либо обходные пути, позволяющие предотвратить сбой в положении при нажатии на наложение?
Будем очень признательны за любую помощь или идеи!
Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-previo
Мобильная версия