Jetpack Compose:如何覆盖可与AndroidView组合



我是Jetpack Compose的新手,正在努力解决下一个任务:

我需要创建一个简单透明的AndroidView。它需要用作可组合函数的覆盖层。

问题是覆盖层的大小应该与下面的合成视图的大小相同

我在这方面做了一些成功的尝试:

@Composable
fun BugseeOverlayView() {
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { ctx ->
View(ctx).apply {
layoutParams = LinearLayout.LayoutParams(200, 200) //Hardcoded size
alpha = 0.0F
}
}, update = {
Bugsee.addSecureView(it) // 3rd party I need to use
}
)
}

然后我用它像:

Box {    
Box(Modifier.fillMaxSize()) {
BugseeOverlayView()
}
Text("Hide me") // or some 'CustomComposableView(param)'
}

这行得通,但尺寸是硬编码的。

PS。我需要一个AndroidView,因为第三方工具接受android.view.view作为参数。

您可以通过各种方式获取可组合的大小。

1-Modifier.onSizeChanged{intSize->}将返回以像素为单位的可组合大小,您可以使用LocalDensity.current.run{}将其转换为dp。通过这种方法,您设置的大小将发生变化,需要进行另一次重组。您也可以从Modifier.onGloballyPositioned中获取可组合的大小。

val density = LocalDensity.current
var dpSize: DpSize by remember{ mutableStateOf(DpSize.Zero) }
Modifier.onSizeChanged { size: IntSize ->
density.run { dpSize = DpSize(size.width.toDp(), size.height.toDp()) }
}
Modifier.onGloballyPositioned {layoutCoordinates: LayoutCoordinates ->
val size = layoutCoordinates.size
density.run { dpSize = DpSize(size.width.toDp(), size.height.toDp()) }
}

2-如果可堆肥具有固定尺寸或覆盖屏幕,则可以使用

BoxWithConstraints {
SomeComposable()
AndroidView(modifier=Modifier.size(maxWidth, maxHeight)
}

3-如果你没有机会得到可组合的大小,也不想再进行一次重组,你可以使用SubcomposeLayout。这里有关于如何创建SubcomposeLayout以在不重新组合的情况下获得可组合的确切大小的详细答案。

当你们能够获得可组合的大小时,你们可以将相同的大小设置为AndroidView,并将布局参数设置为匹配父项。如果这不是你想要的,你仍然可以设置Modifier.fillMaxSize,同时使用上面的方法设置布局参数

最新更新