Commit c35dece1 authored by 7c00's avatar 7c00

实现 android 步行、骑行导航功能

parent 065c2f0e
...@@ -18,6 +18,9 @@ class AMap3DPackage : ReactPackage { ...@@ -18,6 +18,9 @@ class AMap3DPackage : ReactPackage {
AMapPolylineManager(), AMapPolylineManager(),
AMapPolygonManager(), AMapPolygonManager(),
AMapCircleManager(), AMapCircleManager(),
AMapNavigationManager()) AMapDriveManager(),
AMapWalkManager(),
AMapRideManager()
)
} }
} }
package cn.qiuxiang.react.amap3d
import android.annotation.SuppressLint
import com.amap.api.navi.enums.PathPlanningStrategy
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.uimanager.ThemedReactContext
@SuppressLint("ViewConstructor")
class AMapDrive(context: ThemedReactContext) : AMapNavigation(context) {
override fun calculateRoute(args: ReadableArray?) {
val points = args?.getArray(2)!!
navigation.calculateDriveRoute(
listOf(latLngFromReadableMap(args.getMap(0))),
listOf(latLngFromReadableMap(args.getMap(1))),
(0 until points.size()).map { latLngFromReadableMap(points.getMap(it)) },
PathPlanningStrategy.DRIVING_DEFAULT
)
}
}
package cn.qiuxiang.react.amap3d
import com.facebook.react.uimanager.ThemedReactContext
class AMapDriveManager : AMapNavigationManager<AMapDrive>() {
override fun getName(): String {
return "AMapDrive"
}
override fun createViewInstance(reactContext: ThemedReactContext): AMapDrive {
return AMapDrive(reactContext)
}
}
@file:Suppress("OverridingDeprecatedMember", "DEPRECATION", "LeakingThis")
package cn.qiuxiang.react.amap3d package cn.qiuxiang.react.amap3d
import android.annotation.SuppressLint
import com.amap.api.navi.AMapNavi import com.amap.api.navi.AMapNavi
import com.amap.api.navi.AMapNaviListener import com.amap.api.navi.AMapNaviListener
import com.amap.api.navi.AMapNaviView import com.amap.api.navi.AMapNaviView
import com.amap.api.navi.AMapNaviViewListener import com.amap.api.navi.AMapNaviViewListener
import com.amap.api.navi.enums.NaviType import com.amap.api.navi.enums.NaviType
import com.amap.api.navi.enums.PathPlanningStrategy
import com.amap.api.navi.model.* import com.amap.api.navi.model.*
import com.autonavi.tbt.TrafficFacilityInfo import com.autonavi.tbt.TrafficFacilityInfo
import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.Arguments
...@@ -16,11 +16,12 @@ import com.facebook.react.bridge.WritableMap ...@@ -16,11 +16,12 @@ import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.events.RCTEventEmitter import com.facebook.react.uimanager.events.RCTEventEmitter
@SuppressLint("ViewConstructor") abstract class AMapNavigation(context: ThemedReactContext) :
class AMapNavigation(context: ThemedReactContext) :
AMapNaviView(context.currentActivity), AMapNaviViewListener, AMapNaviListener { AMapNaviView(context.currentActivity), AMapNaviViewListener, AMapNaviListener {
val eventEmitter: RCTEventEmitter = context.getJSModule(RCTEventEmitter::class.java) private val eventEmitter: RCTEventEmitter = context.getJSModule(RCTEventEmitter::class.java)
val navigation = AMapNavi.getInstance(context)!! protected val navigation = AMapNavi.getInstance(context)!!
abstract fun calculateRoute(args: ReadableArray?)
init { init {
super.onCreate(null) super.onCreate(null)
...@@ -28,36 +29,15 @@ class AMapNavigation(context: ThemedReactContext) : ...@@ -28,36 +29,15 @@ class AMapNavigation(context: ThemedReactContext) :
navigation.addAMapNaviListener(this) navigation.addAMapNaviListener(this)
} }
fun calculateWalkRoute(args: ReadableArray?) {
navigation.calculateWalkRoute(
latLngFromReadableMap(args?.getMap(0)!!),
latLngFromReadableMap(args.getMap(1)))
}
fun calculateRideRoute(args: ReadableArray?) {
navigation.calculateRideRoute(
latLngFromReadableMap(args?.getMap(0)!!),
latLngFromReadableMap(args.getMap(1)))
}
fun calculateDriveRoute(args: ReadableArray?) {
navigation.calculateDriveRoute(
listOf(latLngFromReadableMap(args?.getMap(0)!!)),
listOf(latLngFromReadableMap(args.getMap(1))),
listOf(),
PathPlanningStrategy.DRIVING_DEFAULT
)
}
fun start() { fun start() {
navigation.startNavi(NaviType.GPS) navigation.startNavi(NaviType.GPS)
} }
fun latLngFromReadableMap(map: ReadableMap): NaviLatLng { protected fun latLngFromReadableMap(map: ReadableMap): NaviLatLng {
return NaviLatLng(map.getDouble("latitude"), map.getDouble("longitude")) return NaviLatLng(map.getDouble("latitude"), map.getDouble("longitude"))
} }
fun sendEvent(name: String, data: WritableMap = Arguments.createMap()) { private fun sendEvent(name: String, data: WritableMap = Arguments.createMap()) {
eventEmitter.receiveEvent(id, name, data) eventEmitter.receiveEvent(id, name, data)
} }
...@@ -65,9 +45,9 @@ class AMapNavigation(context: ThemedReactContext) : ...@@ -65,9 +45,9 @@ class AMapNavigation(context: ThemedReactContext) :
sendEvent("onCalculateRouteSuccess") sendEvent("onCalculateRouteSuccess")
} }
override fun onCalculateRouteFailure(errorCode: Int) { override fun onCalculateRouteFailure(code: Int) {
val event = Arguments.createMap() val event = Arguments.createMap()
event.putInt("errorCode", errorCode) event.putInt("code", code)
sendEvent("onCalculateRouteFailure", event) sendEvent("onCalculateRouteFailure", event)
} }
......
package cn.qiuxiang.react.amap3d package cn.qiuxiang.react.amap3d
import com.facebook.react.bridge.ReadableArray import com.facebook.react.bridge.ReadableArray
import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.common.MapBuilder
import com.facebook.react.uimanager.ViewGroupManager import com.facebook.react.uimanager.ViewGroupManager
class AMapNavigationManager : ViewGroupManager<AMapNavigation>() { abstract class AMapNavigationManager<T : AMapNavigation> : ViewGroupManager<T>() {
override fun getName(): String { override fun onDropViewInstance(view: T) {
return "AMapNavigation"
}
override fun createViewInstance(reactContext: ThemedReactContext): AMapNavigation {
return AMapNavigation(reactContext)
}
override fun onDropViewInstance(view: AMapNavigation) {
super.onDropViewInstance(view) super.onDropViewInstance(view)
view.onDestroy() view.onDestroy()
} }
companion object { companion object {
val START = 1 val START = 1
val CALCULATE_WALK_ROUTE = 2 val CALCULATE_ROUTE = 2
val CALCULATE_RIDE_ROUTE = 3
val CALCULATE_DRIVE_ROUTE = 4
} }
override fun getCommandsMap(): Map<String, Int> { override fun getCommandsMap(): Map<String, Int> {
return mapOf( return mapOf(
"start" to START, "start" to START,
"calculateWalkRoute" to CALCULATE_WALK_ROUTE, "calculateRoute" to CALCULATE_ROUTE
"calculateRideRoute" to CALCULATE_RIDE_ROUTE,
"calculateDriveRoute" to CALCULATE_DRIVE_ROUTE
) )
} }
override fun receiveCommand(view: AMapNavigation, commandId: Int, args: ReadableArray?) { override fun receiveCommand(view: T, commandId: Int, args: ReadableArray?) {
when (commandId) { when (commandId) {
START -> view.start() START -> view.start()
CALCULATE_WALK_ROUTE -> view.calculateWalkRoute(args) CALCULATE_ROUTE -> view.calculateRoute(args)
CALCULATE_RIDE_ROUTE -> view.calculateRideRoute(args)
CALCULATE_DRIVE_ROUTE -> view.calculateDriveRoute(args)
} }
} }
override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> { override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> {
return mapOf( return MapBuilder.of(
"onCalculateRouteSuccess" to mapOf("registrationName" to "onCalculateRouteSuccess"), "onCalculateRouteSuccess", MapBuilder.of("registrationName", "onCalculateRouteSuccess"),
"onCalculateRouteFailure" to mapOf("registrationName" to "onCalculateRouteFailure") "onCalculateRouteFailure", MapBuilder.of("registrationName", "onCalculateRouteFailure")
) )
} }
} }
package cn.qiuxiang.react.amap3d
import android.annotation.SuppressLint
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.uimanager.ThemedReactContext
@SuppressLint("ViewConstructor")
class AMapRide(context: ThemedReactContext) : AMapNavigation(context) {
override fun calculateRoute(args: ReadableArray?) {
navigation.calculateRideRoute(
latLngFromReadableMap(args?.getMap(0)!!),
latLngFromReadableMap(args.getMap(1))
)
}
}
\ No newline at end of file
package cn.qiuxiang.react.amap3d
import com.facebook.react.uimanager.ThemedReactContext
class AMapRideManager : AMapNavigationManager<AMapRide>() {
override fun getName(): String {
return "AMapRide"
}
override fun createViewInstance(reactContext: ThemedReactContext): AMapRide {
return AMapRide(reactContext)
}
}
\ No newline at end of file
package cn.qiuxiang.react.amap3d
import android.annotation.SuppressLint
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.uimanager.ThemedReactContext
@SuppressLint("ViewConstructor")
class AMapWalk(context: ThemedReactContext) : AMapNavigation(context) {
override fun calculateRoute(args: ReadableArray?) {
navigation.calculateWalkRoute(
latLngFromReadableMap(args?.getMap(0)!!),
latLngFromReadableMap(args.getMap(1))
)
}
}
\ No newline at end of file
package cn.qiuxiang.react.amap3d
import com.facebook.react.uimanager.ThemedReactContext
class AMapWalkManager : AMapNavigationManager<AMapWalk>() {
override fun getName(): String {
return "AMapWalk"
}
override fun createViewInstance(reactContext: ThemedReactContext): AMapWalk {
return AMapWalk(reactContext)
}
}
\ No newline at end of file
...@@ -16,11 +16,17 @@ export default class NavigationExample extends Component { ...@@ -16,11 +16,17 @@ export default class NavigationExample extends Component {
{ {
latitude: 39.806901, latitude: 39.806901,
longitude: 116.397972, longitude: 116.397972,
} },
[
{
latitude: 39.866901,
longitude: 116.407972,
},
]
) )
} }
_start = () => {} _start = () => this._navigation.start()
render() { render() {
return <Drive return <Drive
......
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