Commit 837bd8c9 authored by 7c00's avatar 7c00

Add android offline maps module

parent 3e1f8eb1
......@@ -11,7 +11,10 @@ import com.facebook.react.uimanager.ViewManager
class AMap3DPackage : ReactPackage {
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
return listOf(AMapUtilsModule(reactContext))
return listOf(
AMapUtilsModule(reactContext),
AMapOfflineModule(reactContext)
)
}
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
......
package cn.qiuxiang.react.amap3d
import com.amap.api.maps.offlinemap.OfflineMapCity
import com.amap.api.maps.offlinemap.OfflineMapManager
import com.amap.api.maps.offlinemap.OfflineMapProvince
import com.amap.api.maps.offlinemap.OfflineMapStatus
import com.facebook.react.bridge.*
import com.facebook.react.modules.core.DeviceEventManagerModule
@Suppress("unused")
class AMapOfflineModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), OfflineMapManager.OfflineMapDownloadListener {
private val manager = OfflineMapManager(reactContext, this)
override fun getName(): String {
return "AMapOffline"
}
@ReactMethod
fun getProvinces(promise: Promise) {
val provinces = Arguments.createArray()
manager.offlineMapProvinceList.forEach { provinces.pushMap(buildProvince(it)) }
promise.resolve(provinces)
}
@ReactMethod
fun getCities(promise: Promise) {
val cities = Arguments.createArray()
manager.offlineMapCityList.forEach { cities.pushMap(buildCity(it)) }
promise.resolve(cities)
}
@ReactMethod
fun download(name: String) {
manager.offlineMapProvinceList.forEach {
if (it.provinceName == name) {
return manager.downloadByProvinceName(name)
}
it.cityList.forEach {
if (it.city == name) {
return manager.downloadByCityName(name)
}
}
}
}
@ReactMethod
fun stop() {
manager.stop()
}
@ReactMethod
fun remove(name: String) {
manager.remove(name)
}
private fun buildCity(city: OfflineMapCity): WritableMap {
val map = Arguments.createMap()
map.putString("name", city.city)
map.putString("code", city.code)
map.putString("state", getState(city.state))
map.putInt("size", city.size.toInt())
return map
}
private fun buildProvince(province: OfflineMapProvince): WritableMap {
val map = Arguments.createMap()
map.putString("name", province.provinceName)
map.putString("state", getState(province.state))
map.putInt("size", province.size.toInt())
val cities = Arguments.createArray()
province.cityList.forEach { cities.pushMap(buildCity(it)) }
map.putArray("cities", cities)
return map
}
private fun getState(code: Int): String {
var state = ""
when (code) {
OfflineMapStatus.SUCCESS -> state = "downloaded"
OfflineMapStatus.LOADING -> state = "expired"
OfflineMapStatus.NEW_VERSION -> state = "expired"
}
return state
}
override fun onDownload(state: Int, progress: Int, name: String?) {
if (state == OfflineMapStatus.LOADING) {
val data = Arguments.createMap()
data.putString("name", name)
data.putInt("progress", progress)
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit("onDownload", data)
}
}
override fun onCheckUpdate(p0: Boolean, p1: String?) {}
override fun onRemove(p0: Boolean, p1: String?, p2: String?) {}
}
\ No newline at end of file
......@@ -12,6 +12,7 @@ import Polyline from './examples/polyline'
import Polygon from './examples/polygon'
import Circle from './examples/circle'
import Events from './examples/events'
import Offline from './examples/offline'
import Navigation from './examples/navigation'
import HeatMap from './examples/heat-map'
import MultiPoint from './examples/multi-point'
......@@ -29,6 +30,7 @@ export default StackNavigator({
Polygon: {screen: Polygon},
Circle: {screen: Circle},
Events: {screen: Events},
Offline: {screen: Offline},
Navigation: {screen: Navigation},
HeatMap: {screen: HeatMap},
MultiPoint: {screen: MultiPoint},
......
......@@ -43,6 +43,8 @@ export default class Examples extends Component {
{this._renderItem('动画移动', 'Animated')}
<View style={styles.separator}/>
{this._renderItem('地图事件', 'Events')}
<View style={styles.separator}/>
{this._renderItem('离线地图', 'Offline')}
</View>
<View style={styles.group}>
{this._renderItem('添加标记', 'Marker')}
......
import React, {Component} from 'react'
import {Offline} from 'react-native-amap3d'
export default class IndoorExample extends Component {
static navigationOptions = {
title: '离线地图',
}
componentDidMount() {
// Offline.download('铜陵市')
setTimeout(async () => {
console.log(await Offline.getProvinces())
}, 2000)
}
render() {
return null
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment