Commit b9d36b50 authored by wind.wang's avatar wind.wang

update amap3d

parent ce425048
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>locationamap</name>
<comment>Project locationamap created by Buildship.</comment>
<name>react-native-amap-location</name>
<comment>Project react-native-amap-location created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
......@@ -12,6 +17,7 @@
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>
connection.project.dir=
connection.project.dir=../../../../../android
eclipse.preferences.version=1
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>react-native-amap-map</name>
<comment>Project react-native-amap-map created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>
connection.project.dir=../../../../../android
eclipse.preferences.version=1
......@@ -27,6 +27,6 @@ android {
dependencies {
provided 'com.facebook.react:react-native:+'
compile 'com.amap.api:map2d:5.2.0'
compile 'com.amap.api:3dmap:6.6.0'
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
......@@ -8,7 +8,9 @@ import com.facebook.react.uimanager.ViewManager
class AMap3DPackage : ReactPackage {
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
return listOf()
return listOf(
AMapOfflineModule(reactContext)
)
}
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
......@@ -18,7 +20,9 @@ class AMap3DPackage : ReactPackage {
AMapInfoWindowManager(),
AMapPolylineManager(),
AMapPolygonManager(),
AMapCircleManager()
AMapCircleManager(),
AMapHeatMapManager(),
AMapMultiPointManager()
)
}
}
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 = "downloading"
OfflineMapStatus.NEW_VERSION -> state = "expired"
OfflineMapStatus.WAITING -> state = "waiting"
OfflineMapStatus.UNZIP -> state = "unzip"
}
return state
}
override fun onDownload(state: Int, progress: Int, name: String?) {
val data = Arguments.createMap()
data.putString("name", name)
data.putString("state", getState(state))
data.putInt("progress", progress)
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit("download", data)
}
override fun onCheckUpdate(p0: Boolean, p1: String?) {}
override fun onRemove(p0: Boolean, p1: String?, p2: String?) {}
}
\ No newline at end of file
package cn.qiuxiang.react.amap3d
import android.content.res.Resources
import com.amap.api.maps2d.model.LatLng
import com.amap.api.maps2d.model.LatLngBounds
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.LatLngBounds
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
......
......@@ -2,10 +2,10 @@ package cn.qiuxiang.react.amap3d.maps
import android.content.Context
import android.graphics.Color
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.model.Circle
import com.amap.api.maps2d.model.CircleOptions
import com.amap.api.maps2d.model.LatLng
import com.amap.api.maps.AMap
import com.amap.api.maps.model.Circle
import com.amap.api.maps.model.CircleOptions
import com.amap.api.maps.model.LatLng
import com.facebook.react.views.view.ReactViewGroup
class AMapCircle(context: Context) : ReactViewGroup(context), AMapOverlay {
......
package cn.qiuxiang.react.amap3d.maps
import android.content.Context
import cn.qiuxiang.react.amap3d.toLatLngList
import com.amap.api.maps.AMap
import com.amap.api.maps.model.HeatmapTileProvider
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.TileOverlay
import com.amap.api.maps.model.TileOverlayOptions
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.views.view.ReactViewGroup
class AMapHeatMap(context: Context) : ReactViewGroup(context), AMapOverlay {
private var overlay: TileOverlay? = null
private var coordinates: ArrayList<LatLng> = ArrayList()
var opacity: Double = 0.6
var radius: Int = 12
fun setCoordinates(coordinates: ReadableArray) {
this.coordinates = coordinates.toLatLngList()
}
override fun add(map: AMap) {
overlay = map.addTileOverlay(TileOverlayOptions().tileProvider(
HeatmapTileProvider.Builder()
.data(coordinates)
.radius(radius)
.transparency(opacity)
.build()))
}
override fun remove() {
overlay?.remove()
}
}
\ No newline at end of file
package cn.qiuxiang.react.amap3d.maps
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
@Suppress("unused")
internal class AMapHeatMapManager : SimpleViewManager<AMapHeatMap>() {
override fun getName(): String {
return "AMapHeatMap"
}
override fun createViewInstance(reactContext: ThemedReactContext): AMapHeatMap {
return AMapHeatMap(reactContext)
}
@ReactProp(name = "coordinates")
fun setCoordinate(heatMap: AMapHeatMap, coordinates: ReadableArray) {
heatMap.setCoordinates(coordinates)
}
@ReactProp(name = "radius")
fun setRadius(heatMap: AMapHeatMap, radius: Int) {
heatMap.radius = radius
}
@ReactProp(name = "opacity")
fun setOpacity(heatMap: AMapHeatMap, opacity: Double) {
heatMap.opacity = opacity
}
}
\ No newline at end of file
......@@ -5,13 +5,13 @@ import android.graphics.Color
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.model.Marker
import com.amap.api.maps.AMap.InfoWindowAdapter
import com.amap.api.maps.model.Marker
class AMapInfoWindowAdapter(
private val context: Context,
private val markers: HashMap<String, AMapMarker>
) : AMap.InfoWindowAdapter {
) : InfoWindowAdapter {
val paddingTop = context.resources.displayMetrics.density
override fun getInfoWindow(marker: Marker): View? {
......
......@@ -5,8 +5,8 @@ import android.graphics.Bitmap
import android.graphics.Canvas
import android.view.View
import cn.qiuxiang.react.amap3d.toPx
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.model.*
import com.amap.api.maps.AMap
import com.amap.api.maps.model.*
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.views.view.ReactViewGroup
......@@ -59,12 +59,36 @@ class AMapMarker(context: Context) : ReactViewGroup(context), AMapOverlay {
marker?.snippet = value
}
var flat: Boolean = false
set(value) {
field = value
marker?.isFlat = value
}
var opacity: Float = 1f
set(value) {
field = value
marker?.alpha = value
}
var draggable: Boolean = false
set(value) {
field = value
marker?.isDraggable = value
}
var clickDisabled: Boolean = false
set(value) {
field = value
marker?.isClickable = !value
}
var infoWindowDisabled: Boolean = false
set(value) {
field = value
marker?.isInfoWindowEnable = !value
}
var active: Boolean = false
set(value) {
field = value
......@@ -83,14 +107,18 @@ class AMapMarker(context: Context) : ReactViewGroup(context), AMapOverlay {
override fun add(map: AMap) {
marker = map.addMarker(MarkerOptions()
.setFlat(flat)
.icon(bitmapDescriptor)
.alpha(opacity)
.draggable(draggable)
.position(position)
.anchor(anchorU, anchorV)
.infoWindowEnable(!infoWindowDisabled)
.title(title)
.snippet(snippet)
.zIndex(zIndex))
this.clickDisabled = clickDisabled
this.active = active
}
......
......@@ -2,6 +2,7 @@ package cn.qiuxiang.react.amap3d.maps
import android.view.View
import cn.qiuxiang.react.amap3d.toLatLng
import com.amap.api.maps.model.LatLng
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.common.MapBuilder
......@@ -73,11 +74,31 @@ internal class AMapMarkerManager : ViewGroupManager<AMapMarker>() {
view.position = coordinate.toLatLng()
}
@ReactProp(name = "flat")
fun setFlat(marker: AMapMarker, flat: Boolean) {
marker.flat = flat
}
@ReactProp(name = "opacity")
override fun setOpacity(marker: AMapMarker, opacity: Float) {
marker.opacity = opacity
}
@ReactProp(name = "draggable")
fun setDraggable(marker: AMapMarker, draggable: Boolean) {
marker.draggable = draggable
}
@ReactProp(name = "clickDisabled")
fun setClickDisabled(marker: AMapMarker, disabled: Boolean) {
marker.clickDisabled = disabled
}
@ReactProp(name = "infoWindowDisabled")
fun setInfoWindowDisabled(marker: AMapMarker, disabled: Boolean) {
marker.infoWindowDisabled = disabled
}
@ReactProp(name = "active")
fun setSelected(marker: AMapMarker, active: Boolean) {
marker.active = active
......
package cn.qiuxiang.react.amap3d.maps
import android.content.Context
import cn.qiuxiang.react.amap3d.toLatLng
import com.amap.api.maps.AMap
import com.amap.api.maps.model.*
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.views.view.ReactViewGroup
class AMapMultiPoint(context: Context) : ReactViewGroup(context), AMapOverlay {
private var overlay: MultiPointOverlay? = null
private var items: ArrayList<MultiPointItem> = ArrayList()
private var icon: BitmapDescriptor? = null
fun setPoints(points: ReadableArray) {
items = ArrayList((0 until points.size())
.map {
val data = points.getMap(it)
val item = MultiPointItem(data.toLatLng())
if (data.hasKey("title")) {
item.title = data.getString("title")
}
if (data.hasKey("subtitle")) {
item.snippet = data.getString("subtitle")
}
item.customerId = id.toString() + "_" + it
item
})
overlay?.setItems(items)
}
override fun add(map: AMap) {
overlay = map.addMultiPointOverlay(MultiPointOverlayOptions().icon(icon))
overlay?.setItems(items)
overlay?.setEnable(true)
}
override fun remove() {
overlay?.destroy()
}
fun setImage(image: String) {
val drawable = context.resources.getIdentifier(image, "drawable", context.packageName)
icon = BitmapDescriptorFactory.fromResource(drawable)
}
}
\ No newline at end of file
package cn.qiuxiang.react.amap3d.maps
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.common.MapBuilder
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
@Suppress("unused")
internal class AMapMultiPointManager : SimpleViewManager<AMapMultiPoint>() {
override fun getName(): String {
return "AMapMultiPoint"
}
override fun createViewInstance(reactContext: ThemedReactContext): AMapMultiPoint {
return AMapMultiPoint(reactContext)
}
override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? {
return MapBuilder.of(
"onItemPress", MapBuilder.of("registrationName", "onItemPress")
)
}
@ReactProp(name = "points")
fun setPoints(multiPoint: AMapMultiPoint, points: ReadableArray) {
multiPoint.setPoints(points)
}
@ReactProp(name = "image")
fun setImage(multiPoint: AMapMultiPoint, image: String) {
multiPoint.setImage(image);
}
}
\ No newline at end of file
package cn.qiuxiang.react.amap3d.maps
import com.amap.api.maps2d.AMap
import com.amap.api.maps.AMap
interface AMapOverlay {
fun add(map: AMap)
......
......@@ -3,10 +3,10 @@ package cn.qiuxiang.react.amap3d.maps
import android.content.Context
import android.graphics.Color
import cn.qiuxiang.react.amap3d.toLatLngList
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.model.LatLng
import com.amap.api.maps2d.model.Polygon
import com.amap.api.maps2d.model.PolygonOptions
import com.amap.api.maps.AMap
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.Polygon
import com.amap.api.maps.model.PolygonOptions
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.views.view.ReactViewGroup
......
......@@ -3,10 +3,10 @@ package cn.qiuxiang.react.amap3d.maps
import android.content.Context
import android.graphics.Color
import cn.qiuxiang.react.amap3d.toLatLngList
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.model.LatLng
import com.amap.api.maps2d.model.Polyline
import com.amap.api.maps2d.model.PolylineOptions
import com.amap.api.maps.AMap
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.Polyline
import com.amap.api.maps.model.PolylineOptions
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.views.view.ReactViewGroup
......@@ -62,7 +62,9 @@ class AMapPolyline(context: Context) : ReactViewGroup(context), AMapOverlay {
polyline = map.addPolyline(PolylineOptions()
.addAll(coordinates)
.color(color)
.colorValues(colors)
.width(width)
.useGradient(gradient)
.geodesic(geodesic)
.setDottedLine(dashed)
.zIndex(zIndex))
......
package cn.qiuxiang.react.amap3d.maps
import android.content.Context
import android.view.MotionEvent
import android.view.View
import cn.qiuxiang.react.amap3d.toLatLng
import cn.qiuxiang.react.amap3d.toLatLngBounds
import cn.qiuxiang.react.amap3d.toWritableMap
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.CameraUpdateFactory
import com.amap.api.maps2d.MapView
import com.amap.api.maps2d.model.BitmapDescriptorFactory
import com.amap.api.maps2d.model.CameraPosition
import com.amap.api.maps2d.model.Marker
import com.amap.api.maps2d.model.MyLocationStyle
import com.amap.api.maps.AMap
import com.amap.api.maps.CameraUpdateFactory
import com.amap.api.maps.TextureMapView
import com.amap.api.maps.model.BitmapDescriptorFactory
import com.amap.api.maps.model.CameraPosition
import com.amap.api.maps.model.Marker
import com.amap.api.maps.model.MyLocationStyle
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
......@@ -20,18 +19,13 @@ import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.events.RCTEventEmitter
class AMapView(context: Context) : MapView(context) {
class AMapView(context: Context) : TextureMapView(context) {
private val eventEmitter: RCTEventEmitter = (context as ThemedReactContext).getJSModule(RCTEventEmitter::class.java)
private val markers = HashMap<String, AMapMarker>()
private val lines = HashMap<String, AMapPolyline>()
var touchEnable: Boolean = true
private val locationStyle by lazy {
val locationStyle = MyLocationStyle()
locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER)
locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER)
locationStyle
}
......@@ -43,7 +37,7 @@ class AMapView(context: Context) : MapView(context) {
marker.active = false
}
emit(id, "onMapPress", latLng.toWritableMap())
emit(id, "onPress", latLng.toWritableMap())
}
map.setOnMapLongClickListener { latLng ->
......@@ -97,6 +91,18 @@ class AMapView(context: Context) : MapView(context) {
emit(markers[marker.id]?.id, "onInfoWindowPress")
}
map.setOnPolylineClickListener { polyline ->
emit(lines[polyline.id]?.id, "onPress")
}
map.setOnMultiPointClickListener { item ->
val slice = item.customerId.split("_")
val data = Arguments.createMap()
data.putInt("index", slice[1].toInt())
emit(slice[0].toInt(), "onItemPress", data)
false
}
map.setInfoWindowAdapter(AMapInfoWindowAdapter(context, markers))
}
......@@ -189,9 +195,13 @@ class AMapView(context: Context) : MapView(context) {
map.moveCamera(CameraUpdateFactory.newLatLngBounds(region.toLatLngBounds(), 0))
}
fun setLimitRegion(region: ReadableMap) {
map.setMapStatusLimits(region.toLatLngBounds())
}
fun setLocationEnabled(enabled: Boolean) {
map.isMyLocationEnabled = enabled
map.setMyLocationStyle(locationStyle)
map.myLocationStyle = locationStyle
}
fun setLocationInterval(interval: Long) {
......@@ -220,10 +230,6 @@ class AMapView(context: Context) : MapView(context) {
fun setLocationType(type: Int) {
locationStyle.myLocationType(type)
map.setMyLocationStyle(locationStyle)
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return !touchEnable
map.myLocationStyle = locationStyle
}
}
package cn.qiuxiang.react.amap3d.maps
import android.view.View
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.CameraUpdateFactory
import com.amap.api.maps2d.model.LatLng