From 2624efb9aa478d4b507aa815b852bea6600e2e0d Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 15 Jul 2024 16:37:35 +0800 Subject: [PATCH] =?UTF-8?q?[6.5.0][Opt]=E8=B0=83=E6=95=B4=E4=B8=8B?= =?UTF-8?q?=E8=A1=8C=E7=A8=8B=E5=85=A8=E8=A7=88=E7=BA=BF=E7=9A=84=E7=B2=97?= =?UTF-8?q?=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/view/TravelRealityView.kt | 286 +++++++++++------- .../res/drawable-xhdpi/mogo_road_over_nor.png | Bin 0 -> 589 bytes .../road_trajectory_arrow_nor.png | Bin 0 -> 664 bytes .../src/main/res/values/attrs.xml | 2 + 4 files changed, 179 insertions(+), 109 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over_nor.png create mode 100644 core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/road_trajectory_arrow_nor.png diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt index 4f7ec38bfa..5639329f89 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt @@ -129,21 +129,20 @@ class TravelRealityView @JvmOverloads constructor( private var rightPadding: Int = 100 private var bottomPadding: Int = 300 - - private var roadRangeBitmap: BitmapDescriptor? = null + // 绘制智慧道路的范围 + private var roadRange = 56f private var roadRangeDrawable: Int = -1 - private var globalPathColor: Int = Color.parseColor("#49DEAE") - private var roadTrajectoryColor: Int = Color.parseColor("#0FB2D8") - private val roadTrajectoryBitmap by lazy { - BitmapDescriptorFactory.fromResource(R.drawable.mogo_road_over) - } - @Volatile - private var roadRange = minRoadRange - @Volatile - private var roadWidth = minRoadWidth - @Volatile - private var globalWidth = minGlobalWidth + private var roadRangeBitmap: BitmapDescriptor? = null + // 绘制智慧道路范围内的带箭头的轨迹线 + private var roadWidth = 28f + private var roadTrajectoryDrawable: Int = -1 + private var roadTrajectoryColor: Int = Color.parseColor("#0FB2D8") + private var roadTrajectoryBitmap: BitmapDescriptor? = null + + // 轨迹线 + private var globalWidth = 18f + private var globalPathColor: Int = Color.parseColor("#49DEAE") // // 测试时使用 @@ -215,6 +214,8 @@ class TravelRealityView @JvmOverloads constructor( typedArray.getResourceId(R.styleable.TravelRealityView_compassDrawable, -1) roadRangeDrawable = typedArray.getResourceId(R.styleable.TravelRealityView_roadRangeDrawable, -1) + roadTrajectoryDrawable = + typedArray.getResourceId(R.styleable.TravelRealityView_roadTrajectoryDrawable, -1) globalPathColor = typedArray.getInt( R.styleable.TravelRealityView_globalPathColor, Color.parseColor("#49DEAE") @@ -266,7 +267,9 @@ class TravelRealityView @JvmOverloads constructor( LayoutInflater.from(context).inflate(R.layout.module_travel_reality_view, this) mMapView = mapView.findViewById(R.id.travelMapView) roadRangeBitmap = - BitmapDescriptorFactory.fromResource(if (roadRangeDrawable != -1) roadRangeDrawable else R.drawable.taxi_map_arrow_arrived) + BitmapDescriptorFactory.fromResource(if (roadRangeDrawable != -1) roadRangeDrawable else R.drawable.mogo_road_over) + roadTrajectoryBitmap = + BitmapDescriptorFactory.fromResource(if (roadTrajectoryDrawable != -1) roadTrajectoryDrawable else R.drawable.road_trajectory_arrow_nor) initAMapView() } @@ -301,15 +304,22 @@ class TravelRealityView @JvmOverloads constructor( if (loc.latitude.toInt() == 0 || loc.longitude.toInt() == 0) { mAMap?.moveCamera(CameraUpdateFactory.zoomTo(14f)) } else { - mAMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinateConverterWgsToGcj(loc.latitude, loc.longitude), 14f)) + mAMap?.moveCamera( + CameraUpdateFactory.newLatLngZoom( + coordinateConverterWgsToGcj( + loc.latitude, + loc.longitude + ), 14f + ) + ) } //设置地图的样式 mAMap?.uiSettings?.let { //所有手势 it.setAllGesturesEnabled(true) //地图缩放级别的交换按钮 - it.isZoomControlsEnabled = false - it.isZoomGesturesEnabled = false + it.isZoomControlsEnabled = true + it.isZoomGesturesEnabled = true //指南针 it.isCompassEnabled = false //设置倾斜手势是否可用。 @@ -418,15 +428,15 @@ class TravelRealityView @JvmOverloads constructor( globalData[0].lon ) Log.w(TAG, "起终点距离为:$distance") - if (distance < 2000) { - roadRange = maxRoadRange - roadWidth = minRoadWidth - globalWidth = minGlobalWidth - } else { - roadRange = minRoadRange - roadWidth = maxRoadWidth - globalWidth = maxGlobalWidth - } +// if (distance < 2000) { +// roadRange = maxRoadRange +// roadWidth = minRoadWidth +// globalWidth = minGlobalWidth +// } else { +// roadRange = minRoadRange +// roadWidth = maxRoadWidth +// globalWidth = maxGlobalWidth +// } val endOption = MarkerOptions() endOption.icon(BitmapDescriptorFactory.fromResource(endPointDrawable)) @@ -462,8 +472,10 @@ class TravelRealityView @JvmOverloads constructor( ) { return@forEach } - eventBean.orientation = travelNetWorkModel.calculateOrientation(eventBean.lon, eventBean.lat, globalPoint.lon, - globalPoint.lat, globalList[index + 1].lon, globalList[index + 1].lat,) + eventBean.orientation = travelNetWorkModel.calculateOrientation( + eventBean.lon, eventBean.lat, globalPoint.lon, + globalPoint.lat, globalList[index + 1].lon, globalList[index + 1].lat, + ) filterEventWithType(eventBean, eventOptionsList, eventDrawMap) listener?.onDraw(eventDrawMap.values.toList(), true) } @@ -483,19 +495,31 @@ class TravelRealityView @JvmOverloads constructor( val ipList = mutableListOf() roadEventList[0].let { it.ip?.let { ip -> - ipPointMap[ip] = VideoMarkerEntity(coordinateConverterWgsToGcj(it.lat, it.lon), it.title, it.orientation) + ipPointMap[ip] = VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) ipList.add(ip) } } roadEventList[(roadEventList.size - 1) / 2].let { it.ip?.let { ip -> - ipPointMap[ip] = VideoMarkerEntity(coordinateConverterWgsToGcj(it.lat, it.lon), it.title, it.orientation) + ipPointMap[ip] = VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) ipList.add(ip) } } roadEventList[roadEventList.size - 1].let { it.ip?.let { ip -> - ipPointMap[ip] = VideoMarkerEntity(coordinateConverterWgsToGcj(it.lat, it.lon), it.title, it.orientation) + ipPointMap[ip] = VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) ipList.add(ip) } } @@ -538,7 +562,8 @@ class TravelRealityView @JvmOverloads constructor( eventBean.title = "道路施工" roadEventList.add(eventBean) if (!eventDrawMap.containsKey("800002")) { - eventDrawMap["800002"] = EventDrawBean(R.drawable.mogo_shigong_image, "道路施工") + eventDrawMap["800002"] = + EventDrawBean(R.drawable.mogo_shigong_image, "道路施工") } } @@ -591,7 +616,11 @@ class TravelRealityView @JvmOverloads constructor( val ipList = mutableListOf() roadEventList.forEach { it.ip?.let { ip -> - ipPointMap[ip] = VideoMarkerEntity(coordinateConverterWgsToGcj(it.lat, it.lon), it.title, it.orientation) + ipPointMap[ip] = VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) ipList.add(ip) } } @@ -599,10 +628,12 @@ class TravelRealityView @JvmOverloads constructor( for (i in crossDeviceListTmp.indices) { if (maxSize > 0 && !crossDeviceListTmp[i].deviceInfoList.isNullOrEmpty()) { crossDeviceListTmp[i].deviceInfoList!![0].deviceIp?.let { - ipPointMap[it] = VideoMarkerEntity(coordinateConverterWgsToGcj( - crossDeviceListTmp[i].deviceInfoList!![0].lat, - crossDeviceListTmp[i].deviceInfoList!![0].lon - ), "全息路口", crossDeviceListTmp[i].deviceInfoList!![0].orientation) + ipPointMap[it] = VideoMarkerEntity( + coordinateConverterWgsToGcj( + crossDeviceListTmp[i].deviceInfoList!![0].lat, + crossDeviceListTmp[i].deviceInfoList!![0].lon + ), "全息路口", crossDeviceListTmp[i].deviceInfoList!![0].orientation + ) ipList.add(it) maxSize-- } @@ -642,9 +673,16 @@ class TravelRealityView @JvmOverloads constructor( var view: EventVideoView if (ipPointMap[ip] != null) { markerOption.position(ipPointMap[ip]?.latLng) - view = EventVideoView(context, title = ipPointMap[ip]!!.title, orientation = ipPointMap[ip]!!.orientation) + view = EventVideoView( + context, + title = ipPointMap[ip]!!.title, + orientation = ipPointMap[ip]!!.orientation + ) pair = travelNetWorkModel.calculateAnchor(ipPointMap[ip]!!.orientation) - Log.d(TAG, "绘制时位置为:${ipPointMap[ip]?.latLng},标题为:${ipPointMap[ip]!!.title},方向为:${ipPointMap[ip]!!.orientation},锚点为:${pair}") + Log.d( + TAG, + "绘制时位置为:${ipPointMap[ip]?.latLng},标题为:${ipPointMap[ip]!!.title},方向为:${ipPointMap[ip]!!.orientation},锚点为:${pair}" + ) markerOption.anchor(pair.first, pair.second) } else { return@let @@ -656,7 +694,12 @@ class TravelRealityView @JvmOverloads constructor( markerOption.position(ipPointMap[ip]?.latLng) pair = travelNetWorkModel.calculateAnchor(ipPointMap[ip]?.orientation ?: 0) markerOption.anchor(pair.first, pair.second) - downloadImage(roadCamera.imageUrl!!, ipPointMap[ip]?.latLng, ipPointMap[ip]?.title, ipPointMap[ip]?.orientation ?: 0) + downloadImage( + roadCamera.imageUrl!!, + ipPointMap[ip]?.latLng, + ipPointMap[ip]?.title, + ipPointMap[ip]?.orientation ?: 0 + ) } liveOptionsList.add(markerOption) } @@ -690,8 +733,14 @@ class TravelRealityView @JvmOverloads constructor( return@loop } // 计算事件Marker朝向 - deviceBean.orientation = travelNetWorkModel.calculateOrientation(deviceBean.lon, deviceBean.lat, - globalPoint.lon, globalPoint.lat, globalList[index + 1].lon, globalList[index + 1].lat) + deviceBean.orientation = travelNetWorkModel.calculateOrientation( + deviceBean.lon, + deviceBean.lat, + globalPoint.lon, + globalPoint.lat, + globalList[index + 1].lon, + globalList[index + 1].lat + ) deviceInPaths.add(deviceBean) crossOptionsList.add(MarkerOptions().apply { position( @@ -708,7 +757,10 @@ class TravelRealityView @JvmOverloads constructor( } } if (deviceInPaths.isNotEmpty()) { - listener?.onDraw(arrayListOf(EventDrawBean(R.drawable.mogo_quanxi_lukou, "全息路口")), false) + listener?.onDraw( + arrayListOf(EventDrawBean(R.drawable.mogo_quanxi_lukou, "全息路口")), + false + ) } deviceInPathList = arrayListOf(CrossDeviceBean("", 0.0, "", 0.0, deviceInPaths)) // 绘制路口设备 @@ -722,7 +774,7 @@ class TravelRealityView @JvmOverloads constructor( roadRangeOptions.isUseTexture = true roadRangeOptions.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) roadRangeOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) - roadRangeOptions.customTexture = roadTrajectoryBitmap + roadRangeOptions.customTexture = roadRangeBitmap roadRangeList.forEach { pointList -> pointList?.let { @@ -739,21 +791,22 @@ class TravelRealityView @JvmOverloads constructor( private fun handleRoadTrajectories(roadTrajectoryList: List?>?>?) { if (roadTrajectoryList.isNullOrEmpty()) return val globalList = reqData + // 绘制智慧道路范围 val roadTrajectoryOptionsList = ArrayList() val globalOptionList = ArrayList() val globalIndexSet = HashSet() - if (globalList.isNullOrEmpty()) { + if (globalList.isNullOrEmpty()) {// 无轨迹时以道路中心线为中轴画给定宽度的纹理 val boundsBuilder = LatLngBounds.Builder() var latLngTmp: LatLng roadTrajectoryList.forEach { trajectoryList -> val options = PolylineOptions() trajectoryList?.forEach loop@{ trajPointList -> if (trajPointList.isNullOrEmpty() || trajPointList.size < 2) return@loop - options.width(AutoSizeUtils.dp2px(context, minRoadRange).toFloat()) + options.width(AutoSizeUtils.dp2px(context, roadRange).toFloat()) options.isUseTexture = true options.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) options.lineCapType(PolylineOptions.LineCapType.LineCapSquare) - options.customTexture = roadTrajectoryBitmap + options.customTexture = roadRangeBitmap latLngTmp = coordinateConverterWgsToGcj( trajPointList[1], trajPointList[0] @@ -778,8 +831,8 @@ class TravelRealityView @JvmOverloads constructor( } else { roadTrajectoryList.forEach { trajectoryList -> var distanceTmp: Double - var lastIndex = -1 - var polylineOptionTmp: PolylineOptions? = null +// var lastIndex = -1 +// var polylineOptionTmp: PolylineOptions? = null trajectoryList?.forEachIndexed { index, trajPointList -> if (trajPointList.isNullOrEmpty()) return@forEachIndexed @@ -813,54 +866,54 @@ class TravelRealityView @JvmOverloads constructor( if (distanceTmp < 50) { Log.d(TAG, "智慧道路内点索引为:$i") globalIndexSet.add(i) - if (lastIndex < 0 || index - lastIndex > 1) { - // 绘制新的智慧路段轨迹 - polylineOptionTmp = PolylineOptions() - polylineOptionTmp?.let { optionTmp -> - buildPolylineOption( - optionTmp, - roadRange, - roadTrajectoryBitmap - ) - optionTmp.add( - coordinateConverterWgsToGcj( - trajPointList[1], - trajPointList[0] - ) - ) - optionTmp.add( - coordinateConverterWgsToGcj( - trajectoryList[index + 1]!![1], - trajectoryList[index + 1]!![0] - ) - ) - // 待绘制多段智慧道路的轨迹线 - roadTrajectoryOptionsList.add(optionTmp) - } - lastIndex = index + 1 - } else if (index == lastIndex) { - polylineOptionTmp?.add( - coordinateConverterWgsToGcj( - trajectoryList[index + 1]!![1], - trajectoryList[index + 1]!![0] - ) - ) - lastIndex = index + 1 - } else if (index - lastIndex == 1) { - polylineOptionTmp?.add( - coordinateConverterWgsToGcj( - trajPointList[1], - trajPointList[0] - ) - ) - polylineOptionTmp?.add( - coordinateConverterWgsToGcj( - trajectoryList[index + 1]!![1], - trajectoryList[index + 1]!![0] - ) - ) - lastIndex = index + 1 - } +// if (lastIndex < 0 || index - lastIndex > 1) { +// // 绘制新的智慧路段轨迹 +// polylineOptionTmp = PolylineOptions() +// polylineOptionTmp?.let { optionTmp -> +// buildPolylineOption( +// optionTmp, +// roadRange, +// roadRangeBitmap +// ) +// optionTmp.add( +// coordinateConverterWgsToGcj( +// trajPointList[1], +// trajPointList[0] +// ) +// ) +// optionTmp.add( +// coordinateConverterWgsToGcj( +// trajectoryList[index + 1]!![1], +// trajectoryList[index + 1]!![0] +// ) +// ) +// // 待绘制多段智慧道路的轨迹线 +// roadTrajectoryOptionsList.add(optionTmp) +// } +// lastIndex = index + 1 +// } else if (index == lastIndex) { +// polylineOptionTmp?.add( +// coordinateConverterWgsToGcj( +// trajectoryList[index + 1]!![1], +// trajectoryList[index + 1]!![0] +// ) +// ) +// lastIndex = index + 1 +// } else if (index - lastIndex == 1) { +// polylineOptionTmp?.add( +// coordinateConverterWgsToGcj( +// trajPointList[1], +// trajPointList[0] +// ) +// ) +// polylineOptionTmp?.add( +// coordinateConverterWgsToGcj( +// trajectoryList[index + 1]!![1], +// trajectoryList[index + 1]!![0] +// ) +// ) +// lastIndex = index + 1 +// } } } } @@ -868,17 +921,29 @@ class TravelRealityView @JvmOverloads constructor( } var lastIndex = -1 var optionTmp: PolylineOptions? = null + var polylineOptionTmp: PolylineOptions? = null globalList.forEachIndexed { index, point -> if (!globalIndexSet.contains(index)) return@forEachIndexed Log.w(TAG, "智慧道路内点索引为:$index") if (lastIndex < 0 || index - lastIndex > 1) { globalOptionList.add(PolylineOptions().also { optionTmp = it - buildPolylineOptionWithColor(it, roadWidth, roadTrajectoryColor) + // 生成在智慧道路范围内的轨迹 + buildPolylineOptionWithTexture(it, roadWidth, roadTrajectoryBitmap!!) + it.add(coordinateConverterWgsToGcj(point.lat, point.lon)) + }) + roadTrajectoryOptionsList.add(PolylineOptions().also { + polylineOptionTmp = it + buildPolylineOption( + polylineOptionTmp!!, + roadRange, + roadRangeBitmap!! + ) it.add(coordinateConverterWgsToGcj(point.lat, point.lon)) }) } else { optionTmp?.add(coordinateConverterWgsToGcj(point.lat, point.lon)) + polylineOptionTmp?.add(coordinateConverterWgsToGcj(point.lat, point.lon)) } lastIndex = index } @@ -902,16 +967,16 @@ class TravelRealityView @JvmOverloads constructor( optionTmp.customTexture = descriptor } - private fun buildPolylineOptionWithColor( + private fun buildPolylineOptionWithTexture( optionTmp: PolylineOptions, width: Float, - color: Int + descriptor: BitmapDescriptor ) { optionTmp.width(AutoSizeUtils.dp2px(context, width).toFloat()) - optionTmp.isUseTexture = false + optionTmp.isUseTexture = true optionTmp.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) optionTmp.lineCapType(PolylineOptions.LineCapType.LineCapSquare) - optionTmp.color(color) + optionTmp.customTexture = descriptor } private fun drawCarMarker(location: MogoLocation) { @@ -1021,18 +1086,21 @@ class TravelRealityView @JvmOverloads constructor( }) // 获取道路事件 val cityCode = CallerMapUIServiceManager.getCityCode() ?: "0734" - travelNetWorkModel.getEventsWithTrajRequest(EventReqEntity(pointList, cityCode), onSuccess = { - Log.d(TAG, "Events result is:$it") - handleRoadEvent(it) - }, onError = { - Log.d(TAG, "Events error is:$it") - }) + travelNetWorkModel.getEventsWithTrajRequest( + EventReqEntity(pointList, cityCode), + onSuccess = { + Log.d(TAG, "Events result is:$it") + handleRoadEvent(it) + }, + onError = { + Log.d(TAG, "Events error is:$it") + }) if (!isRoadTrackReq) { handleRoadTrajectories(roadTrackList) } } } - + interface OnDrawListener { // isEvent为true表示是事件,反之则表示全息路口 fun onDraw(eventList: List, isEvent: Boolean) diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over_nor.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..d88b6647a74f5ba7214867f36362e610d10c3972 GIT binary patch literal 589 zcmeAS@N?(olHy`uVBq!ia0vp^AwV3!!3HGTe+69!QjEnx?oJHr&dIz4a$Hg)JkxxA z8MJ_G4hF{dOa>N^5+IfWVg?501&j>LK$;OGwtxvP8?t~I&JF-6bb689093Z!)5S5Q zg7NL`jlRx~0EHIuXKmW`pJwQ=H>Jt%;p#eBq>%CL;OYgm5O}Yd zxJl**?^(MFQIW|{9WK0S4tF$+_N)Ms2e` zoY_(TXqomykJT$9_R7s@J;cRhU;Q>A+48~nx|rA#Gds_AJltH76+QiI(c1f8pUzeM z?YB6~B3osfX>gg^E~bbyfM1Gw7xBP|LyAxIk)iguQQa`Z|*$0;X|L?>5PlfyX!9gDDaxscPqN<{QDo-il-Gy z+5{?m?y^q&@qb1YU)Hs051%}8<5*>yZ7^r?<_T}>y$@UOUU!u3WCTZ?zyX0to2SV? zPrs-6V$S;VyxL14T}pGW-|vpU+Hj2_ep_aNvXl7J?Df~fT5lfVxg2zSU)HpX?ra(h zzn@>F|DndxKzOBV?VgVxcR%;@KXpF;?zG)K$2R=QT)JhO!LRCzJ8js%hPxj>s{Un$ s)npcCBT<$U6NH1=L=K7=62<(_U>($PZ^14`Yf!52boFyt=akR{0Bz|DI{*Lx literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml index 2fa5f485e5..8804eec2cf 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml @@ -60,6 +60,8 @@ + +