用JetPack Compose帮我写一个悬浮窗,此悬浮窗可以显示在其他应用上层
时间: 2023-05-14 18:05:07 浏览: 68
好的,以下是使用 JetPack Compose 编写悬浮窗的示例代码:
```
@Composable
fun FloatingWindow() {
val windowParams = remember { WindowManager.LayoutParams().apply {
type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
format = PixelFormat.TRANSLUCENT
gravity = Gravity.TOP or Gravity.START
width = 200.dp.toPx()
height = 200.dp.toPx()
x = 0
y = 0
} }
val windowManager = LocalWindowManager.current
val density = LocalDensity.current
var offsetX by remember { mutableStateOf(0f) }
var offsetY by remember { mutableStateOf(0f) }
var isDragging by remember { mutableStateOf(false) }
Box(
Modifier
.offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
.background(Color.White, RoundedCornerShape(8.dp))
.pointerInput(Unit) {
forEachGesture {
awaitPointerEventScope {
val down = awaitFirstDown()
isDragging = true
val position = down.position
val density = LocalDensity.current
val offsetXStart = with(density) { position.x.toDp() }
val offsetYStart = with(density) { position.y.toDp() }
val startX = offsetX
val startY = offsetY
val touchSlop = with(density) { 8.dp.toPx() }
drag(down.id) {
val dx = it.positionChange().x
val dy = it.positionChange().y
if (sqrt(dx * dx + dy * dy) > touchSlop) {
offsetX = startX + dx
offsetY = startY + dy
}
}
isDragging = false
}
}
}
) {
Text(
"Hello, World!",
Modifier.padding(16.dp),
color = Color.Black,
fontSize = 16.sp
)
}
LaunchedEffect(windowManager) {
windowManager.addView(
AndroidView(
factory = { context ->
AndroidView(context).apply {
layoutParams = windowParams
}
},
update = { view ->
view.setContent {
Box(
Modifier
.fillMaxSize()
.background(Color.Transparent)
) {
if (!isDragging) {
windowParams.x = offsetX.roundToInt()
windowParams.y = offsetY.roundToInt()
windowManager.updateViewLayout(view, windowParams)
}
this@Box.setContent(this)
}
}
}
)
)
}
}
```
这个示例代码使用 `WindowManager` 创建了一个悬浮窗,并使用 `JetPack Compose` 实现了拖拽功能。你可以根据自己的需求修改代码,比如更改悬浮窗的大小、位置等。