Когда пузырь наложения перетаскивается из позиции 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? Есть ли какие-либо обходные пути, чтобы предотвратить эту ошибку положения при нажатии на наложение?
Будем очень признательны за любую помощь или идеи!
ОБНОВЛЕНО [26.11.2024]
@Composable
fun FloatingBubbleContent(
isMenuVisible: Boolean,
onBubbleClick: () -> Unit,
interceptTouchEvents: Boolean = false
) {
Box(
modifier = Modifier
.width(174.dp) // Fixed width
.height(56.dp) // Fixed height
.then(
if (interceptTouchEvents) {
Modifier.clickable(onClick = onBubbleClick)
} else {
Modifier
}
)
) {
Box(
modifier = Modifier
.size(56.dp) // Fixed bubble size
.align(Alignment.CenterEnd) // Align bubble to the right
) {
BubbleIcon()
}
AnimatedMenu(
isVisible = isMenuVisible,
modifier = Modifier.align(Alignment.CenterStart)
)
}
}
@Composable
private fun AnimatedMenu(
isVisible: Boolean,
modifier: Modifier = Modifier
) {
AnimatedVisibility(
visible = isVisible,
enter = fadeIn() + slideIn(initialOffset = { IntOffset(-50, 0) }),
exit = fadeOut() + slideOut(targetOffset = { IntOffset(-50, 0) }),
modifier = modifier
) {
Box(
modifier = Modifier
.width(118.dp) // 70dp + 48dp
.height(56.dp) // Match bubble height
) {
Column(
modifier = Modifier
.offset(x = (-70).dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
MenuButton(
icon = Icons.Rounded.Call,
backgroundColor = Color(0xFF4CAF50),
onClick = { /* Handle call */ }
)
MenuButton(
icon = Icons.Rounded.Email,
backgroundColor = Color(0xFF2196F3),
onClick = { /* Handle email */ }
)
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-previo
Мобильная версия