diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml new file mode 100644 index 0000000..15e6a4b --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml new file mode 100644 index 0000000..15e6a4b --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_main_color.xml b/app/src/main/res/drawable/bg_solid_layout_main_color.xml new file mode 100644 index 0000000..e329b7d --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_main_color.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml new file mode 100644 index 0000000..15e6a4b --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_main_color.xml b/app/src/main/res/drawable/bg_solid_layout_main_color.xml new file mode 100644 index 0000000..e329b7d --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_main_color.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml index ea46f09..786dc13 100644 --- a/app/src/main/res/layout/marker_gaode.xml +++ b/app/src/main/res/layout/marker_gaode.xml @@ -1,16 +1,27 @@ - + android:background="@drawable/bg_solid_layout_main_color" + android:orientation="vertical" + android:paddingVertical="@dimen/dp_3"> + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml new file mode 100644 index 0000000..15e6a4b --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_main_color.xml b/app/src/main/res/drawable/bg_solid_layout_main_color.xml new file mode 100644 index 0000000..e329b7d --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_main_color.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml index ea46f09..786dc13 100644 --- a/app/src/main/res/layout/marker_gaode.xml +++ b/app/src/main/res/layout/marker_gaode.xml @@ -1,16 +1,27 @@ - + android:background="@drawable/bg_solid_layout_main_color" + android:orientation="vertical" + android:paddingVertical="@dimen/dp_3"> + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/popu_map_info.xml b/app/src/main/res/layout/popu_map_info.xml new file mode 100644 index 0000000..9fdc82d --- /dev/null +++ b/app/src/main/res/layout/popu_map_info.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml new file mode 100644 index 0000000..15e6a4b --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_main_color.xml b/app/src/main/res/drawable/bg_solid_layout_main_color.xml new file mode 100644 index 0000000..e329b7d --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_main_color.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml index ea46f09..786dc13 100644 --- a/app/src/main/res/layout/marker_gaode.xml +++ b/app/src/main/res/layout/marker_gaode.xml @@ -1,16 +1,27 @@ - + android:background="@drawable/bg_solid_layout_main_color" + android:orientation="vertical" + android:paddingVertical="@dimen/dp_3"> + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/popu_map_info.xml b/app/src/main/res/layout/popu_map_info.xml new file mode 100644 index 0000000..9fdc82d --- /dev/null +++ b/app/src/main/res/layout/popu_map_info.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/well_location.png b/app/src/main/res/mipmap-xxhdpi/well_location.png index 483687f..b89a974 100644 --- a/app/src/main/res/mipmap-xxhdpi/well_location.png +++ b/app/src/main/res/mipmap-xxhdpi/well_location.png Binary files differ diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml new file mode 100644 index 0000000..15e6a4b --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_main_color.xml b/app/src/main/res/drawable/bg_solid_layout_main_color.xml new file mode 100644 index 0000000..e329b7d --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_main_color.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml index ea46f09..786dc13 100644 --- a/app/src/main/res/layout/marker_gaode.xml +++ b/app/src/main/res/layout/marker_gaode.xml @@ -1,16 +1,27 @@ - + android:background="@drawable/bg_solid_layout_main_color" + android:orientation="vertical" + android:paddingVertical="@dimen/dp_3"> + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/popu_map_info.xml b/app/src/main/res/layout/popu_map_info.xml new file mode 100644 index 0000000..9fdc82d --- /dev/null +++ b/app/src/main/res/layout/popu_map_info.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/well_location.png b/app/src/main/res/mipmap-xxhdpi/well_location.png index 483687f..b89a974 100644 --- a/app/src/main/res/mipmap-xxhdpi/well_location.png +++ b/app/src/main/res/mipmap-xxhdpi/well_location.png Binary files differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 6da1a9c..1dbf606 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,6 +9,7 @@ #FF0000 #FF6600 #37D4AE + #99000000 #C0000000 diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 037fd9b..5a9dad8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,6 +13,7 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val DISTANCE = 5 //两点间距离阈值,单位:米 val HOME_ICONS = arrayOf( diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 41ffcc3..43e1317 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -4,6 +4,9 @@ import android.location.Location import android.os.Bundle import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions @@ -13,6 +16,7 @@ import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel @@ -29,9 +33,10 @@ * @email 290677893@qq.com */ class MapActivity : BaseActivity(), AMap.OnMapLoadedListener, AMap.OnMyLocationChangeListener, - AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { private val kTag = "MapActivity" + private val context = this@MapActivity private var authenticatedType: MutableList = ArrayList() private lateinit var deviceViewModel: DeviceViewModel private lateinit var aMap: AMap @@ -51,6 +56,16 @@ */ private var markerOptionsInView: MutableList = ArrayList() + /** + * 自定义Marker弹出框 + * */ + private var infoWindow: View? = null + + /** + * 所有设备列表信息集合 + * */ + private var deviceModels: MutableList = ArrayList() + override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { @@ -73,6 +88,7 @@ deviceViewModel.mapDeviceResultModel.observe(this, { if (it.code == 200) { it.data?.forEach { dataModel -> + deviceModels.add(dataModel) val lat = dataModel.latitude.toString() val lng = dataModel.longitude.toString() if (lat.isNotBlank() && lng.isNotBlank()) { @@ -121,8 +137,8 @@ aMap.addOnCameraChangeListener(this) // marker点击事件监听 aMap.addOnMarkerClickListener(this) - //信息窗点击事件 - aMap.addOnInfoWindowClickListener(this) + // 点击marker弹出自定义popup + aMap.setInfoWindowAdapter(this) } override fun onMapLoaded() { @@ -163,7 +179,7 @@ markerOptionsInView.forEach { if (clustersMarkers.size == 0) { //添加一个新的自定义marker - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80))//相距多少才聚合 + clustersMarkers.add(GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE)) } else { var isInRange = false //Kotlin foreach不能用break @@ -178,7 +194,9 @@ //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 if (!isInRange) { //相距多少才聚合 - clustersMarkers.add(GaoDeClusterMarkerView(this, it, proj, 80)) + clustersMarkers.add( + GaoDeClusterMarkerView(context, it, proj, Constant.RADIUS_SIZE) + ) } } } @@ -206,10 +224,43 @@ return true } - override fun onInfoWindowClick(p0: Marker?) { + override fun getInfoWindow(marker: Marker?): View? { + if (infoWindow == null) { + infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) + } + val v = infoWindow!! + //反射得到popup里面的控件对象 + val deviceCodeView = v.findViewById(R.id.deviceCodeView) + val deviceModelView = v.findViewById(R.id.deviceModelView) + val deviceTypeView = v.findViewById(R.id.deviceTypeView) + val wellCodeView = v.findViewById(R.id.wellCodeView) + val ownerShipView = v.findViewById(R.id.ownerShipView) + val locationView = v.findViewById(R.id.locationView) + //绑定数据 + val clickedLatLng = marker?.position!! + for (device in deviceModels) { + if (clickedLatLng.latitude == device.latitude!!.toDouble() + && clickedLatLng.longitude == device.longitude!!.toDouble() + ) { + deviceCodeView.text = String.format("设备编号: ${device.devcode}") + deviceModelView.text = String.format("设备模型: ${device.modelName}") + deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") + wellCodeView.text = String.format("井编号: ${device.wellCode}") + ownerShipView.text = String.format("所属单位: ${device.deptName}") + locationView.text = String.format("详细位置: ${device.position}") + return infoWindow + } + } + "请不要点击多个位置点".show() + return null } + /** + * 此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框 + * */ + override fun getInfoContents(p0: Marker?): View? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mapView.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt index 8c723e6..3c7784f 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -91,7 +91,7 @@ val wellCountView = view.findViewById(R.id.wellCountView) return if (num > 1) { wellCountView.visibility = View.VISIBLE - wellCountView.text = String.format("${num}个") + wellCountView.text = String.format("${num}件/套") wellCountView.gravity = Gravity.CENTER view.toBitmap() } else { diff --git a/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml new file mode 100644 index 0000000..15e6a4b --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_black_transparent_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_main_color.xml b/app/src/main/res/drawable/bg_solid_layout_main_color.xml new file mode 100644 index 0000000..e329b7d --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_main_color.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml index ea46f09..786dc13 100644 --- a/app/src/main/res/layout/marker_gaode.xml +++ b/app/src/main/res/layout/marker_gaode.xml @@ -1,16 +1,27 @@ - + android:background="@drawable/bg_solid_layout_main_color" + android:orientation="vertical" + android:paddingVertical="@dimen/dp_3"> + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/popu_map_info.xml b/app/src/main/res/layout/popu_map_info.xml new file mode 100644 index 0000000..9fdc82d --- /dev/null +++ b/app/src/main/res/layout/popu_map_info.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/well_location.png b/app/src/main/res/mipmap-xxhdpi/well_location.png index 483687f..b89a974 100644 --- a/app/src/main/res/mipmap-xxhdpi/well_location.png +++ b/app/src/main/res/mipmap-xxhdpi/well_location.png Binary files differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 6da1a9c..1dbf606 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,6 +9,7 @@ #FF0000 #FF6600 #37D4AE + #99000000 #C0000000 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 7ab9e13..b537141 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -129,4 +129,13 @@ @dimen/dp_5 true + +