Android 14: служба кнопок наложения (TYPE_APPLICATION_OVERLAY) сбивается на предыдущее положение при первом нажатииAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android 14: служба кнопок наложения (TYPE_APPLICATION_OVERLAY) сбивается на предыдущее положение при первом нажатии

Сообщение Anonymous »

Описание проблемы:
Когда пузырь наложения перетаскивается из позиции 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»