我用Compose做了一个地图轮子OmniMap

文章介绍了如何在Compose中使用地图,包括高德、腾讯、百度地图的渲染、配置、移动相机以及覆盖物的支持。作者提供了自定义MarkerInfoWindow的内容,并分享了源码仓库,鼓励读者Star以关注更新。
摘要由CSDN通过智能技术生成

一、前言

半年前,我发布过一篇介绍:Compose里面如何使用地图,比如高德地图 的文章,原本是没有想造什么轮子的✍️

闲来无事,有一天看到了评论区留言让我把源码地址分享出来,我感觉我太懒了,后来忘记了,就连自己在别的市场上的app都停更一年多了,这一次是为了大家更好的摸鱼写的,绝对不是为了我自己更好的摸鱼。

在某个阳光明媚的早上,无意间刷到google的map-compose,看了下挺不错的,那就站在巨人的肩膀上,🤔我沉思了下

国内4大地图平台,我想换到别的平台,还得写不少东西,那我就参考google-map-compose造个轮子吧,为了更便捷的换地图 (说错了,是为了大家更好的摸鱼)

目前轮子进展,文章末尾有仓库源码地址,记得Star哦,持续更新中...

  • 高德地图 → 1.0.2
  • 腾讯地图 → 1.0.2
  • 百度地图 → 1.0.2
  • 花瓣地图(Android 7.0+) → 实现中
  • Google地图 → 未开始

二、用法

1、添加地图

我们在OmniMap中提供了:GDMapTXMapBDMapHWMapGGMap 可组合项来渲染我们的地图MapView

渲染高德地图

GDMap(modifier = Modifier.fillMaxSize()){ ... }

渲染腾讯地图

TXMap(modifier = Modifier.fillMaxSize()){ ... }

渲染百度地图

BDMap(modifier = Modifier.fillMaxSize()){ ... }

2、配置地图

在图可组合项,我们提供 MapUiSettingsMapProperties 配置地图

MapUiSettings:与UI相关的设置的数据类
MapProperties:可在地图上修改的属性的数据类


高德地图

// 高德地图
GDMap(
    modifier = Modifier.fillMaxSize(),
    properties = MapProperties(...),
    uiSettings = MapUiSettings(...)
)

腾讯地图

// 腾讯地图
TXMap(
    modifier = Modifier.fillMaxSize(),
    properties = MapProperties(...),
    uiSettings = MapUiSettings(...)
)

// 百度地图
BDMap(
    modifier = Modifier.fillMaxSize(),
    properties = MapProperties(...),
    uiSettings = MapUiSettings(...)
)

3、移动地图相机

在图可组合项,我们提供 CameraPositionState 来控制地图相机

CameraPositionState:控制和观察地图的相机状态


高德地图

// 高德地图
val cameraPosState = rememberCameraPositionState()
val scope = rememberCoroutineScope()
GDMap(
    modifier = Modifier.fillMaxSize(),
    // 默认提供的位置在:天安门
    cameraPositionState = cameraPosState
)
Button(onClick = {
    scope.launch {
        cameraPosState.animate(CameraUpdateFactory.newLatLngZoom(LatLng(40.186009,116.400088),13F))
    }
}){
    Text(text = "移动地图相机")
}


腾讯地图:

// 腾讯地图
val cameraPosState = rememberCameraPositionState()
val scope = rememberCoroutineScope()
TXMap(
    modifier = Modifier.fillMaxSize(),
    // 默认提供的位置在:天安门
    cameraPositionState = cameraPosState
)
Button(onClick = {
    scope.launch {
        cameraPosState.animate(CameraUpdateFactory.newLatLngZoom(LatLng(40.186009,116.400088),13F))
    }
}){
    Text(text = "移动地图相机")
}

4、已支持的覆盖物

高德地图腾讯地图百度地图
Arc、Circle、ClusterOverlay、GroundOverlay、Marker、MovingPointOverlay、MultiPointOverlay、OpenGLOverlay、Polygon、Polyline、RoutePlanOverlay、TileOverlayArc、Circle、ClusterOverlay、GroundOverlay、Marker、MovingPointOverlay、Polygon、Polyline、TileOverlayArc、Circle、ClusterOverlay、GroundOverlay、Marker、MultiPointOverlay、Polygon、Polyline、TileOverlay、RoutePlanOverlay、TextOverlay、TraceOverlay、BM3DBuildOverlay、BM3DModelOverlay、BM3DPrismOverlay

以上覆盖物均有对应实现的示例程序。

高德地图见sample-gaode
腾讯地图见sample-tencent
百度地图见sample-baidu

下面是示例的演示效果

5、自定义Marker覆盖物的InfoWindow

提供2中修改MarkerInfoWindow :

MarkerInfoWindowContent:只填充子视图,不修改默认InfoWindow窗口背景
MarkerInfoWindow:完全定制InfoWindow窗口及内容

// 只修改内容,不修改容器
MarkerInfoWindowContent(
    //...
    title = "我是title",
    snippet = "我是snippet"
) { marker ->
    Column {
        Text(marker.title ?: "", color = Color.Green)
        Text(marker.snippet ?: "", color = Color.Red)
    }
}

// 修改容器及内容
MarkerInfoWindow(
    //...
    snippet = "我是一个卖报的小画家(自定义InfoWindow)"
) { marker ->
    Card(modifier = Modifier.requiredSizeIn(maxWidth = 88.dp, minHeight = 66.dp)) {
        Text(
            modifier = Modifier.padding(4.dp),
            text = marker.snippet ?: "", color = Color.Red)
    }
}

3、集成

repositories {
  maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
}

dependencies {
  // 根据自己项目情况,选择下面其中一种地图
  // 高德地图
  implementation 'io.github.TheMelody:gd_compose:<version>'      
  // 腾讯地图
  implementation 'io.github.TheMelody:tencent_compose:<version>'      
  // 百度地图
  implementation 'io.github.TheMelody:baidu_compose:<version>' 
}

渲染高德地图

GDMap(modifier = Modifier.fillMaxSize(),...){ 
  // 这里放置已提供的地图覆盖物
  ...
}

渲染腾讯地图

TXMap(modifier = Modifier.fillMaxSize(),...){ 
  // 这里放置已提供的地图覆盖物
  ...
}

渲染百度地图

BDMap(modifier = Modifier.fillMaxSize(),...){ 
  // 这里放置已提供的地图覆盖物
  ...
}

源码地址OmniMap-Compose点个Star哦,持续更新中...

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Halifax ‎

交个朋友

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值