【问题标题】:Use composable instead of marker in google maps?在谷歌地图中使用可组合而不是标记?
【发布时间】:2022-01-11 21:52:44
【问题描述】:

我知道可以使用自定义视图而不是 Google 地图中的基本地图标记来执行this answer 中所述的操作。我很好奇是否可以使用 Compose 实现类似的效果?

由于ComposeView 是最终类,因此无法直接扩展它,所以我想有一个FrameLayout 可以将它添加为一个孩子。尽管这似乎导致了竞争条件,因为可组合项的绘制与普通 android Views 略有不同。

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)
    }

}

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

【问题讨论】:

    标签: android google-maps android-jetpack-compose


    【解决方案1】:

    您尝试创建的MapMarkerViewViewGroup 的间接子代。 ComposeView 也是 ViewGroup 的间接子代,这意味着您可以在打算使用此类的地方直接替换 ComposeViewComposeView 类不应该被子类化。作为开发人员,您真正需要关心的唯一事情是它的setContent 方法。

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

    现在您可以在代码中将MapMarkerView 替换为composeView,甚至可以在需要View 或其任何子类的任何位置使用它。

    【讨论】:

    • 这是一个好点,因为它不需要包装 FrameLayout,尽管在制作自定义谷歌地图标记时尝试生成位图时,这仍然不能解决 compose 的异步性质。
    猜你喜欢
    • 2017-12-29
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多