在谷歌地图中使用可组合而不是标记?

And*_*etz 6 android google-maps android-jetpack-compose

我知道可以使用自定义视图而不是 Google 地图中的基本地图标记来执行此答案中所述的操作。我很好奇是否可以通过 Compose 达到类似的效果?

由于ComposeView是最后一堂课,无法直接扩展它,所以我正在考虑有一个FrameLayout可以将其作为子项添加的课程。尽管这似乎会导致竞争条件,因为可组合项的绘制与普通 android 略有不同View

class MapMarkerView : FrameLayout {

    constructor(context: Context) : super(context) {
        initView()
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        initView()
    }

    private fun initView() {
        val composeView = ComposeView(context).apply {
            layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
        }
        composeView.setContent {
            // this runs asynchronously making the the bitmap generation not include composable at runtime?
            Text(text = "2345", modifier = Modifier.background(Color.Green, RoundedCornerShape(4.dp)))
        }
        addView(composeView)
    }

}
Run Code Online (Sandbox Code Playgroud)

我读过的大多数文章都有一些用于生成这样的位图的回调函数但在每个视图都是动态生成的并且需要立即转换为地图位图的用例中,这不一定有效。

Raf*_*ani 0

MapMarkerView尝试创建的 是 的间接子级ViewGroupComposeView也是其间接子级,这意味着您可以在打算使用此类的地方ViewGroup直接替换 a 。ComposeView该类ComposeView并不意味着可以进行子类化。作为开发人员,您唯一真正需要关心的是它的setContent方法。

val composeView: View = ComposeView(context).apply{
   setContent {
       Text(text = "2345", modifier = Modifier.background(Color.Green, RoundedCornerShape(4.dp)))
   }
}
 
Run Code Online (Sandbox Code Playgroud)

现在,您可以在代码MapMarkerView中用 this替换 ,甚至可以在需要它的一个或任何子类的任何位置使用它。composeViewView