Commit ab216237 authored by 7c00's avatar 7c00

简单实现导航功能

parent 32cc0fb6
......@@ -26,6 +26,6 @@ android {
dependencies {
provided 'com.facebook.react:react-native:+'
compile 'com.amap.api:3dmap:5.2.1'
compile 'com.amap.api:navi-3dmap:5.3.0_3dmap5.3.0'
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}
......@@ -8,5 +8,7 @@
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
</manifest>
......@@ -17,6 +17,7 @@ class AMap3DPackage : ReactPackage {
AMapOverlayManager(),
AMapPolylineManager(),
AMapPolygonManager(),
AMapCircleManager())
AMapCircleManager(),
AMapNavigationManager())
}
}
package cn.qiuxiang.react.amap3d
import android.annotation.SuppressLint
import com.amap.api.navi.AMapNavi
import com.amap.api.navi.AMapNaviListener
import com.amap.api.navi.AMapNaviView
import com.amap.api.navi.AMapNaviViewListener
import com.amap.api.navi.enums.NaviType
import com.amap.api.navi.enums.PathPlanningStrategy
import com.amap.api.navi.model.*
import com.autonavi.tbt.TrafficFacilityInfo
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.events.RCTEventEmitter
@SuppressLint("ViewConstructor")
class AMapNavigation(context: ThemedReactContext) :
AMapNaviView(context.currentActivity), AMapNaviViewListener, AMapNaviListener {
val eventEmitter: RCTEventEmitter = context.getJSModule(RCTEventEmitter::class.java)
val navigation = AMapNavi.getInstance(context)!!
init {
super.onCreate(null)
this.setAMapNaviViewListener(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() {
navigation.startNavi(NaviType.GPS)
}
fun latLngFromReadableMap(map: ReadableMap): NaviLatLng {
return NaviLatLng(map.getDouble("latitude"), map.getDouble("longitude"))
}
fun sendEvent(name: String, data: WritableMap = Arguments.createMap()) {
eventEmitter.receiveEvent(id, name, data)
}
override fun onCalculateRouteSuccess(array: IntArray) {
sendEvent("onCalculateRouteSuccess")
}
override fun onCalculateRouteFailure(errorCode: Int) {
val event = Arguments.createMap()
event.putInt("errorCode", errorCode)
sendEvent("onCalculateRouteFailure", event)
}
override fun onInitNaviSuccess() {
sendEvent("onReady")
}
override fun onServiceAreaUpdate(p0: Array<out AMapServiceAreaInfo>?) {
}
override fun onEndEmulatorNavi() {
}
override fun onArrivedWayPoint(p0: Int) {
}
override fun onArriveDestination() {
}
override fun onPlayRing(p0: Int) {
}
override fun onTrafficStatusUpdate() {
}
override fun onGpsOpenStatus(p0: Boolean) {
}
override fun updateAimlessModeCongestionInfo(p0: AimLessModeCongestionInfo?) {
}
override fun showCross(p0: AMapNaviCross?) {
}
override fun onGetNavigationText(p0: Int, p1: String?) {
}
override fun onGetNavigationText(p0: String?) {
}
override fun updateAimlessModeStatistics(p0: AimLessModeStat?) {
}
override fun hideCross() {
}
override fun onInitNaviFailure() {
}
override fun onReCalculateRouteForTrafficJam() {
}
override fun hideLaneInfo() {
}
override fun onNaviInfoUpdated(p0: AMapNaviInfo?) {
}
override fun updateCameraInfo(p0: Array<out AMapNaviCameraInfo>?) {
}
override fun onLocationChange(p0: AMapNaviLocation?) {
}
override fun onReCalculateRouteForYaw() {
}
override fun onStartNavi(p0: Int) {
}
override fun notifyParallelRoad(p0: Int) {
}
override fun OnUpdateTrafficFacility(p0: AMapNaviTrafficFacilityInfo?) {
}
override fun OnUpdateTrafficFacility(p0: Array<out AMapNaviTrafficFacilityInfo>?) {
}
override fun OnUpdateTrafficFacility(p0: TrafficFacilityInfo?) {
}
override fun showLaneInfo(p0: Array<out AMapLaneInfo>?, p1: ByteArray?, p2: ByteArray?) {
}
override fun onNaviInfoUpdate(p0: NaviInfo?) {
}
override fun onNaviTurnClick() {
}
override fun onNaviViewLoaded() {
}
override fun onNaviBackClick(): Boolean {
return false
}
override fun onNaviMapMode(p0: Int) {
}
override fun onNextRoadClick() {
}
override fun onScanViewButtonClick() {
}
override fun onLockMap(p0: Boolean) {
}
override fun onNaviSetting() {
}
override fun onNaviCancel() {
}
}
package cn.qiuxiang.react.amap3d
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.ViewGroupManager
class AMapNavigationManager : ViewGroupManager<AMapNavigation>() {
override fun getName(): String {
return "AMapNavigation"
}
override fun createViewInstance(reactContext: ThemedReactContext): AMapNavigation {
return AMapNavigation(reactContext)
}
override fun onDropViewInstance(view: AMapNavigation) {
super.onDropViewInstance(view)
view.onDestroy()
}
companion object {
val START = 1
val CALCULATE_WALK_ROUTE = 2
val CALCULATE_RIDE_ROUTE = 3
val CALCULATE_DRIVE_ROUTE = 4
}
override fun getCommandsMap(): Map<String, Int> {
return mapOf(
"start" to START,
"calculateWalkRoute" to CALCULATE_WALK_ROUTE,
"calculateRideRoute" to CALCULATE_RIDE_ROUTE,
"calculateDriveRoute" to CALCULATE_DRIVE_ROUTE
)
}
override fun receiveCommand(view: AMapNavigation, commandId: Int, args: ReadableArray?) {
when (commandId) {
START -> view.start()
CALCULATE_WALK_ROUTE -> view.calculateWalkRoute(args)
CALCULATE_RIDE_ROUTE -> view.calculateRideRoute(args)
CALCULATE_DRIVE_ROUTE -> view.calculateDriveRoute(args)
}
}
override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> {
return mapOf(
"onReady" to mapOf("registrationName" to "onReady"),
"onCalculateRouteSuccess" to mapOf("registrationName" to "onCalculateRouteSuccess"),
"onCalculateRouteFailure" to mapOf("registrationName" to "onCalculateRouteFailure")
)
}
}
......@@ -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 Navigation from './examples/navigation'
export default StackNavigator({
Examples: {screen: Examples},
......@@ -26,6 +27,7 @@ export default StackNavigator({
Polygon: {screen: Polygon},
Circle: {screen: Circle},
Events: {screen: Events},
Navigation: {screen: Navigation},
}, {
navigationOptions: {
headerTintColor: '#212121',
......
import React, {Component} from 'react'
import {
View,
Text,
Platform,
ScrollView,
StatusBar,
StyleSheet,
Text,
TouchableHighlight,
TouchableNativeFeedback,
Platform,
StatusBar,
View,
} from 'react-native'
let Touchable = TouchableHighlight
......@@ -45,6 +45,8 @@ export default class Examples extends Component {
{this._renderItem('动画移动', 'Animated')}
<View style={styles.separator}/>
{this._renderItem('地图事件', 'Events')}
<View style={styles.separator}/>
{this._renderItem('导航', 'Navigation')}
</View>
<View style={styles.group}>
{this._renderItem('添加标记', 'Marker')}
......
import React, {Component} from 'react'
import {StyleSheet} from 'react-native'
import {Navigation} from 'react-native-amap3d'
export default class NavigationExample extends Component {
static navigationOptions = {
title: '导航',
}
_ready = () => {
this._navigation.calculateDriveRoute(
{
latitude: 39.906901,
longitude: 116.397972,
},
{
latitude: 39.806901,
longitude: 116.397972,
}
)
}
_start = () => this._navigation.start()
render() {
return <Navigation
ref={ref => this._navigation = ref}
style={StyleSheet.absoluteFill}
onReady={this._ready}
onCalculateRouteSuccess={this._start}
/>
}
}
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