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? Существуют ли какие-либо обходные пути, позволяющие предотвратить сбой в положении при нажатии на наложение?
Будем очень признательны за любую помощь или идеи!

Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-previo
Ответить

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

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

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

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

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