From c7621f37807832a1529162b63384232f6c5b44fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Mon, 12 Apr 2021 11:34:11 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/v2x/utils/TestOnLineCarUtils.java | 2 +- ...io_push_vr_event_data_yongdu_gongsi_1.json | 71 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 modules/mogo-module-v2x/src/main/res/raw/scenario_push_vr_event_data_yongdu_gongsi_1.json diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/TestOnLineCarUtils.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/TestOnLineCarUtils.java index 33eafe8543..e47a234730 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/TestOnLineCarUtils.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/TestOnLineCarUtils.java @@ -430,7 +430,7 @@ public class TestOnLineCarUtils { try { InputStream inputStream = V2XUtils.getApp() .getResources() - .openRawResource(R.raw.scenario_push_vr_event_data_yongdu_gongsi); + .openRawResource(R.raw.scenario_push_vr_event_data_yongdu_gongsi_1); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = -1; byte[] buffer = new byte[1024]; diff --git a/modules/mogo-module-v2x/src/main/res/raw/scenario_push_vr_event_data_yongdu_gongsi_1.json b/modules/mogo-module-v2x/src/main/res/raw/scenario_push_vr_event_data_yongdu_gongsi_1.json new file mode 100644 index 0000000000..1f41a45323 --- /dev/null +++ b/modules/mogo-module-v2x/src/main/res/raw/scenario_push_vr_event_data_yongdu_gongsi_1.json @@ -0,0 +1,71 @@ +{ + "sceneId": "200008", + "alarmContent": "拥堵路线推荐", + "expireTime": 10000, + "sceneCategory": 0, + "sceneDescription": "拥堵路线推荐", + "sceneName": "拥堵路线推荐", + "sceneLevel": 0, + "videoUrl": "", + "videoChannel": "", + "videoSn": "", + "tts": "发现前方拥堵,最优路线快6分钟", + "zoom": false, + "zoomScale": 15, + "userHead": "", + "msgImgUrl": "", + "lat":39.969088, + "lon":116.41808, + "polyline": [ + [ + 116.417388,39.983351 + ], + [ + 116.417351,39.9841 + ], + [ + 116.417286,39.985423 + ], + [ + 116.417233,39.98673 + ], + [ + 116.417179,39.988156 + ], + [ + 116.417158,39.988493 + ], + [ + 116.417142,39.989245 + ], + [ + 116.417174,39.990199 + ] + ], + "recommendPolyline": [ + [ + 116.417388,39.983351 + ], + [ + 116.417351,39.9841 + ], + [ + 116.417286,39.985423 + ], + [ + 116.417233,39.98673 + ], + [ + 116.417179,39.988156 + ], + [ + 116.417158,39.988493 + ], + [ + 116.417142,39.989245 + ], + [ + 116.417174,39.990199 + ] + ] +} \ No newline at end of file From c61ed0930d1ce1442c24323b6746615db0c45ff7 Mon Sep 17 00:00:00 2001 From: liujing Date: Mon, 12 Apr 2021 12:21:57 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E5=81=9C=E6=AD=A2=E7=BA=BF=E7=BB=98?= =?UTF-8?q?=E5=88=B6=E6=B5=8B=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/MoGoV2XCloundDataManager.java | 26 ++++++++----------- .../scene/warning/V2XWarningMarker.java | 4 +++ .../res/raw/scenario_warning_event_data.json | 10 ++++--- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java index 23fd49041f..d30a11282e 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java @@ -47,6 +47,7 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog private static String TAG = "MoGoV2XCloundDataManager"; private boolean isSelfLineClear; private List fillPoints = new ArrayList();//停止线经纬度合集 + private static long showTime = 0; @Override public void init(Context context) { @@ -59,6 +60,7 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog Log.d(V2XConst.LOG_NAME_WARN, "analysisV2XCloundDataEvent -----> "); mCloundWarningInfo = cloundWarningInfo; + showTime = mCloundWarningInfo.getShowTime(); pointsBetween(); //发送预警提示 @@ -68,10 +70,10 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog Log.d(V2XConst.LOG_NAME_WARN, "direction = " + cloundWarningInfo.getDirection()); if (cloundWarningInfo.getDirection() == 1) { //前方 - //停止线前方画线 MogoLatLng newLocation = LocationUtils.getNewLocation((MogoLatLng) fillPoints.get(0), 80, cloundWarningInfo.getAngle()); + //停止线前方画线 WorkThreadHandler.getInstance().postDelayed(() -> { - //添加停止线marker + //添加停止线 drawStopLineWith2Resource(); //二轮车和行人的渲染和移动 V2XWarnDataDrawer.getInstance().renderWarnData(cloundWarningInfo); @@ -84,7 +86,7 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog V2XServiceManager.getMoGoWarnPolylineManager().clearLine(); V2XServiceManager.getMoGoStopPolylineManager().clearLine(); isSelfLineClear = true; - }, 8000); + }, showTime); } else { //左侧或者右侧 WorkThreadHandler.getInstance().postDelayed(() -> { @@ -98,9 +100,8 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog UiThreadHandler.postDelayed(() -> { V2XServiceManager.getMoGoPersonWarnPolylineManager().clearLine(); V2XServiceManager.getMoGoWarnPolylineManager().clearLine(); - isSelfLineClear = true; - }, 8000); + }, showTime); } } @@ -124,10 +125,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog * 2D资源绘制停止线 * */ private void drawStopLineWith2Resource() { - - //自车位置39.97665425796924--116.41769983329762 - mCloundWarningInfo.setCarLocation(new MogoLatLng(39.97665425796924,116.41769983329762));//测试数据 - MogoLatLng carlo = mCloundWarningInfo.getCarLocation(); if (carlo == null) { double lon = MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLon(); @@ -136,11 +133,11 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog } //自车行驶方向的前方*米的经纬度,该经纬度在停止线上 MogoLatLng drawStopLineLon = LocationUtils.getNewLocation(carlo, mCloundWarningInfo.getStopLineDistance(), mCloundWarningInfo.getAngle()); - Log.d(TAG, "2D资源绘制停止线"+drawStopLineLon); + Log.d(TAG, "2D资源绘制停止线" + drawStopLineLon); MogoMarkerOptions optionsRipple = new MogoMarkerOptions() .latitude(drawStopLineLon.getLat()) .longitude(drawStopLineLon.getLon()) - .anchor(0.5f, 0.5f) + .anchor(1.0f, 1.0f) .zIndex(MarkerDrawer.MARKER_Z_INDEX_HIGH); optionsRipple @@ -148,9 +145,9 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog IMogoMarker stopLine = V2XServiceManager.getMarkerManager().addMarker(TYPE_MARKER_CLOUD_STOP_LINE_DATA, optionsRipple); stopLine.setInfoWindowAdapter(new SimpleWindow3DAdapter(new V2XFrontTargetMarkerView(V2XServiceManager.getContext()))); stopLine.showInfoWindow(); -// UiThreadHandler.postDelayed(() -> { -// stopLine.hideInfoWindow(); -// }, 8000); + UiThreadHandler.postDelayed(() -> { + stopLine.hideInfoWindow(); + }, showTime); } /** @@ -302,7 +299,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog private MogoLatLng getMogoLat(MogoLatLng latlng) { MogoLatLng newLocation = LocationUtils.getNewLocation(latlng, mCloundWarningInfo.getDistance(), mCloundWarningInfo.getDirection()); - return newLocation; } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/warning/V2XWarningMarker.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/warning/V2XWarningMarker.java index 6470241db7..c6b26b9c3a 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/warning/V2XWarningMarker.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/warning/V2XWarningMarker.java @@ -24,6 +24,7 @@ import com.mogo.module.v2x.marker.OptimalSpeedMarkerView; import com.mogo.module.v2x.marker.V2XFrontTargetMarkerView; import com.mogo.module.v2x.scenario.view.IV2XMarker; import com.mogo.module.v2x.utils.LocationUtils; +import com.mogo.utils.UiThreadHandler; import com.mogo.utils.ViewUtils; import com.mogo.utils.WorkThreadHandler; @@ -65,6 +66,9 @@ public class V2XWarningMarker implements IV2XMarker { optimalMarker = V2XServiceManager.getMarkerManager().addMarker(V2X_FRONT_WARNING_MARKER, optionsRipple); optimalMarker.setInfoWindowAdapter(new SimpleWindow3DAdapter(new V2XFrontTargetMarkerView(mContext))); optimalMarker.showInfoWindow(); + UiThreadHandler.postDelayed(() -> { + optimalMarker.hideInfoWindow(); + }, 8000); } catch (Exception e) { diff --git a/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json b/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json index 5963e668f3..62454570d9 100644 --- a/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json +++ b/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json @@ -20,9 +20,13 @@ "direction": 1, "speed": 11.108121, "targetColor": "#FF4040", - "stopLineDistance": 15, + "stopLineDistance": 20, "warningContent": "小心行人", "heading": 0, - "showTime": 3000, - "roadwidth": 60.0 + "showTime": 8000, + "roadwidth": 60.0, + "carLocation": { + "lat": 39.97665425, + "lon": 116.41769983 + } } \ No newline at end of file From c60fb914c145f1bbc90351bd5bb1f0b5810acff3 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 12 Apr 2021 15:17:19 +0800 Subject: [PATCH 03/12] .. --- .../src/main/java/com/mogo/module/common/MogoModulePaths.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModulePaths.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModulePaths.java index d204367c99..139b433a1c 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModulePaths.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModulePaths.java @@ -15,10 +15,10 @@ import java.util.List; */ public class MogoModulePaths { - private static List< MogoModule > mMogoModules = new ArrayList<>(); + private static final List< MogoModule > mMogoModules = new ArrayList<>(); // 不需要启动APP也能运行的模块 - private static List< MogoModule > mMogoBaseModules = new ArrayList<>(); + private static final List< MogoModule > mMogoBaseModules = new ArrayList<>(); /** * 地图模块 fragment 路径 From 6cc1a9fe2b5c481cd4ca60645d9933a4d99c4000 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 12 Apr 2021 15:53:18 +0800 Subject: [PATCH 04/12] .. --- .idea/gradle.xml | 1 + .../com/mogo/launcher/MogoApplication.java | 21 ++++++++----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 83405b8de1..4ff10f68a5 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -91,6 +91,7 @@ diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index d748a8a008..dd46fdd897 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -183,20 +183,16 @@ public class MogoApplication extends AbsMogoApplication { */ private void prepareBaseService(IMogoServiceApis apis, long delay) { - UiThreadHandler.postDelayed(() -> { - // 第三方平台的sn是服务端生成的,所以必须在返回后才能开启 - if (TextUtils.isEmpty(Utils.getSn())) { - preparePassportEnvironment(apis, () -> { - prepareSocketAndLocationServices(apis); - }); - } else { - preparePassportEnvironment(apis, null); - prepareSocketAndLocationServices(apis); - } - }, delay); + // 第三方平台的sn是由AI云SDK中服务调用通过服务端生成的 + preparePassportEnvironment(); + prepareSocketAndLocationServices(apis); + //无延迟 +// UiThreadHandler.postDelayed(() -> { +// +// }, delay); } - private void preparePassportEnvironment(IMogoServiceApis apis, Runnable after) { + private void preparePassportEnvironment() { // 配置云服务API MoGoAiCloudClientConfig clientConfig = MoGoAiCloudClientConfig.getInstance(); // 设置网络环境:HTTP_DNS_ENV_QA、HTTP_DNS_ENV_RELEASE、HTTP_DNS_ENV_DEV @@ -257,6 +253,7 @@ public class MogoApplication extends AbsMogoApplication { } private void prepareSocketAndLocationServices(IMogoServiceApis apis) { + //开启Socket长链服务 apis.getSocketManagerApi(getApplicationContext()).init(getApplicationContext(), DebugConfig.getSocketAppId()); if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { apis.getLocationInfoApi().start(); From 8fa4e0b7462f6469954892dfc3de8b37cab2e9af Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 12 Apr 2021 15:54:55 +0800 Subject: [PATCH 05/12] .. --- app/src/main/java/com/mogo/launcher/MogoApplication.java | 6 +++--- .../src/main/java/com/mogo/utils/UiThreadHandler.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index dd46fdd897..81ff2b0da1 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -187,9 +187,9 @@ public class MogoApplication extends AbsMogoApplication { preparePassportEnvironment(); prepareSocketAndLocationServices(apis); //无延迟 -// UiThreadHandler.postDelayed(() -> { -// -// }, delay); + UiThreadHandler.postDelayed(() -> { + + }, delay); } private void preparePassportEnvironment() { diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/UiThreadHandler.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/UiThreadHandler.java index 7225548d91..383ff712f7 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/UiThreadHandler.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/UiThreadHandler.java @@ -5,9 +5,9 @@ import android.os.Looper; public class UiThreadHandler { - private static Handler sUiHandler = new Handler( Looper.getMainLooper() ); + private static final Handler sUiHandler = new Handler( Looper.getMainLooper() ); - private static Object sToken = new Object(); + private static final Object sToken = new Object(); public UiThreadHandler() { } From be610701c7c592ff53c0076a9fe9a6c6f02c8178 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 12 Apr 2021 15:55:21 +0800 Subject: [PATCH 06/12] .. --- app/src/main/java/com/mogo/launcher/MogoApplication.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 81ff2b0da1..dd46fdd897 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -187,9 +187,9 @@ public class MogoApplication extends AbsMogoApplication { preparePassportEnvironment(); prepareSocketAndLocationServices(apis); //无延迟 - UiThreadHandler.postDelayed(() -> { - - }, delay); +// UiThreadHandler.postDelayed(() -> { +// +// }, delay); } private void preparePassportEnvironment() { From ecfc07a771e6025e5a94c6f7a0d726788c30e259 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Mon, 12 Apr 2021 16:14:16 +0800 Subject: [PATCH 07/12] fixed conflict --- .../impl/MoGoV2XCloundDataManager.java | 49 +++++++++---------- .../res/raw/scenario_warning_event_data.json | 2 +- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java index d30a11282e..3550dad486 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/manager/impl/MoGoV2XCloundDataManager.java @@ -47,6 +47,9 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog private static String TAG = "MoGoV2XCloundDataManager"; private boolean isSelfLineClear; private List fillPoints = new ArrayList();//停止线经纬度合集 + private boolean isFirstLocation = false; + private MogoLatLng mNewLocation; + private static long showTime = 0; @Override @@ -58,17 +61,15 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog @Override public void analysisV2XCloundDataEvent(V2XWarningEntity cloundWarningInfo) { Log.d(V2XConst.LOG_NAME_WARN, "analysisV2XCloundDataEvent -----> "); - mCloundWarningInfo = cloundWarningInfo; showTime = mCloundWarningInfo.getShowTime(); pointsBetween(); //发送预警提示 MarkerServiceHandler.getApis().getV2XListenerManager().warningChangedForListenerWithDirection(cloundWarningInfo.getType(), MogoReceiver.ACTION_V2X_FRONT_WARNING); - isSelfLineClear = false; + isFirstLocation = false; - Log.d(V2XConst.LOG_NAME_WARN, "direction = " + cloundWarningInfo.getDirection()); if (cloundWarningInfo.getDirection() == 1) { //前方 MogoLatLng newLocation = LocationUtils.getNewLocation((MogoLatLng) fillPoints.get(0), 80, cloundWarningInfo.getAngle()); //停止线前方画线 @@ -79,7 +80,9 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog V2XWarnDataDrawer.getInstance().renderWarnData(cloundWarningInfo); //绘制识别物与交汇点连线,并且更新连线数据 drawStopLine(cloundWarningInfo, newLocation); - }, 200); + //添加停止线marker + handleStopLine(); + }, 800); UiThreadHandler.postDelayed(() -> { V2XServiceManager.getMoGoPersonWarnPolylineManager().clearLine(); @@ -94,7 +97,7 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog drawOtherObjectLine(cloundWarningInfo); //二轮车和行人的渲染和移动 V2XWarnDataDrawer.getInstance().renderWarnData(cloundWarningInfo); - }, 200); + }, 500); //延迟3秒清理线 UiThreadHandler.postDelayed(() -> { @@ -103,7 +106,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog isSelfLineClear = true; }, showTime); } - } @@ -111,7 +113,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog for (int i = 0; i < fillPoints.size(); i++) { V2XWarningEntity entity = new V2XWarningEntity(); MogoLatLng latLng = (MogoLatLng) fillPoints.get(i); - Log.d("liyz", "handleStopLine lat = " + latLng.lat + "--lon =" + latLng.lon); entity.setLat(latLng.lat); entity.setLon(latLng.lon); entity.setCollisionLat(mCloundWarningInfo.getCollisionLat()); @@ -158,20 +159,15 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog if (info != null) { if (polyLine != null) { Log.d(V2XConst.LOG_NAME_WARN, "drawStopLine polyLine != null"); - polyLine.setPoints(Arrays.asList(new MogoLatLng(info.getLat(), info.getLon()), - new MogoLatLng(info.getCollisionLat(), info.getCollisionLon()))); + polyLine.setPoints(Arrays.asList(new MogoLatLng(mNewLocation.lat, mNewLocation.lon), + new MogoLatLng(mogoLatLng.lat, mogoLatLng.lon))); polyLine.setTransparency(0.5f); } else { - Log.e(V2XConst.LOG_NAME_WARN, "drawStopLine polyLine == null"); DrawLineInfo lineInfo = new DrawLineInfo(); - MogoLatLng startLatlng = new MogoLatLng( - ((MogoLatLng) fillPoints.get(0)).lat, - ((MogoLatLng) fillPoints.get(0)).lon); - Log.d(V2XConst.LOG_NAME_WARN, "stop drawStopLine lon =" + startLatlng.lon + "--lat =" + startLatlng.lat); + MogoLatLng startLatlng = new MogoLatLng(mNewLocation.lat, mNewLocation.lon); MogoLatLng endLatlng = new MogoLatLng(mogoLatLng.lat, mogoLatLng.lon); - Log.d(V2XConst.LOG_NAME_WARN, " drawStopLine lon =" + mogoLatLng.lon + "--lat =" + mogoLatLng.lat); - Log.d(V2XConst.LOG_NAME_WARN, " drawStopLine lon =" + endLatlng.lon + "--lat =" + endLatlng.lat); - + Log.d(V2XConst.LOG_NAME_WARN, " drawStopLine endLatlng lon =" + endLatlng.lon + "--lat =" + endLatlng.lat + + "--startLatlng lon = " + startLatlng.lon + "-lat = " + startLatlng.lat); lineInfo.setStartLocation(startLatlng); lineInfo.setEndLocation(endLatlng); lineInfo.setHeading(info.heading); @@ -198,7 +194,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog new MogoLatLng(info.getCollisionLat(), info.getCollisionLon()))); polyLine.setTransparency(0.5f); } else { - Log.e(V2XConst.LOG_NAME_WARN, "polyLine == null"); DrawLineInfo lineInfo = new DrawLineInfo(); MogoLatLng startLatlng = new MogoLatLng(info.getLat(), info.getLon()); MogoLatLng endLatlng = new MogoLatLng(info.getCollisionLat(), info.getCollisionLon()); @@ -225,7 +220,7 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog */ @Override public void onCarLocationChanged2(Location latLng) { - Log.e(V2XConst.LOG_NAME_WARN, "onCarLocationChanged2 latLng = " + latLng.getLatitude() + "--" + latLng.getLongitude() + "---isSelfLineClear = " + isSelfLineClear); +// Log.d(V2XConst.LOG_NAME_WARN, "onCarLocationChanged2 latLng = " + latLng.getLatitude() + "--" + latLng.getLongitude() + "---isSelfLineClear = " + isSelfLineClear); //当行人经纬度交点 开始画线,否则清理 mCloundWarningInfo.setCarLocation(new MogoLatLng(latLng.getLatitude(), latLng.getLongitude())); drawSlefCarLine(latLng); @@ -243,17 +238,22 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog if (!isSelfLineClear) { IMogoPolyline mogoPolyline = V2XServiceManager.getMoGoWarnPolylineManager().getMogoWarnPolyline(); if (mCloundWarningInfo != null) { + if (!isFirstLocation) { + mNewLocation = getMogoLat(new MogoLatLng(latLng.getLatitude(), latLng.getLongitude())); + Log.d(V2XConst.LOG_NAME_WARN, "drawSlefCarLine lon = " + mNewLocation.lon + "---lat = " + mNewLocation.lat); + isFirstLocation = true; + } if (mogoPolyline != null) { mogoPolyline.setPoints(Arrays.asList(new MogoLatLng(latLng.getLatitude(), latLng.getLongitude()), - new MogoLatLng(mCloundWarningInfo.getDirection() == 1 ? mCloundWarningInfo.getStopLines().get(0).lat : mCloundWarningInfo.getCollisionLat(), - mCloundWarningInfo.getDirection() == 1 ? mCloundWarningInfo.getStopLines().get(0).lon : mCloundWarningInfo.getCollisionLon()))); + new MogoLatLng(mCloundWarningInfo.getDirection() == 1 ? mNewLocation.lat : mCloundWarningInfo.getCollisionLat(), + mCloundWarningInfo.getDirection() == 1 ? mNewLocation.lon : mCloundWarningInfo.getCollisionLon()))); mogoPolyline.setTransparency(0.5f); } else { - Log.e(V2XConst.LOG_NAME_WARN, "onCarLocationChanged2 mogoPolyline == null width = " + mCloundWarningInfo.getRoadwidth()); +// Log.e(V2XConst.LOG_NAME_WARN, "onCarLocationChanged2 mogoPolyline == null width = " + mCloundWarningInfo.getRoadwidth()); DrawLineInfo info = new DrawLineInfo(); // 对象 MogoLatLng startLatlng = new MogoLatLng(latLng.getLatitude(), latLng.getLongitude()); - MogoLatLng endLatlng = new MogoLatLng(mCloundWarningInfo.getDirection() == 1 ? mCloundWarningInfo.getStopLines().get(0).lat : mCloundWarningInfo.getCollisionLat(), - mCloundWarningInfo.getDirection() == 1 ? mCloundWarningInfo.getStopLines().get(0).lon : mCloundWarningInfo.getCollisionLon()); + MogoLatLng endLatlng = new MogoLatLng(mCloundWarningInfo.getDirection() == 1 ? mNewLocation.lat : mCloundWarningInfo.getCollisionLat(), + mCloundWarningInfo.getDirection() == 1 ? mNewLocation.lon : mCloundWarningInfo.getCollisionLon()); info.setHeading(latLng.getBearing()); info.setStartLocation(startLatlng); info.setEndLocation(endLatlng); @@ -294,7 +294,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog } catch (Exception e) { e.printStackTrace(); } - } private MogoLatLng getMogoLat(MogoLatLng latlng) { diff --git a/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json b/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json index 62454570d9..c9530e4ff2 100644 --- a/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json +++ b/modules/mogo-module-v2x/src/main/res/raw/scenario_warning_event_data.json @@ -20,7 +20,7 @@ "direction": 1, "speed": 11.108121, "targetColor": "#FF4040", - "stopLineDistance": 20, + "stopLineDistance": 3000, "warningContent": "小心行人", "heading": 0, "showTime": 8000, From 70e07b633b9c1851f372f6589d4035b83a3ddae1 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 12 Apr 2021 16:33:09 +0800 Subject: [PATCH 08/12] open queryOnLineCarWithRoute --- .../com/mogo/module/main/MainActivity.java | 2 +- .../com/mogo/module/service/MogoServices.java | 29 ++++++++++--------- .../service/marker/MapMarkerManager.java | 8 ++--- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java index f9feb2a41c..02f4ca2e39 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java @@ -53,7 +53,7 @@ public class MainActivity extends MvpActivity implement IMogoADASControlStatusChangedListener, FragmentStackTransactionListener { - protected static final String TAG = MainActivity.class.getSimpleName(); + protected static final String TAG = "MainActivity"; protected IMogoServiceApis mServiceApis; protected IMogoFragmentManager mMogoFragmentManager; diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index e7f8271915..9a0d9d421c 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -119,7 +119,12 @@ public class MogoServices implements IMogoMapListener, /** * 自动刷新策略 */ - private AutoRefreshStrategy mAutoRefreshStrategy = new AutoRefreshStrategy(); + private final AutoRefreshStrategy mAutoRefreshStrategy = new AutoRefreshStrategy(); + /** + * 手动刷新策略 + */ + private final CustomRefreshStrategy mCustomRefreshStrategy = new CustomRefreshStrategy(); + private MogoLatLng mLastAutoRefreshLocation = null; private IMogoMapUIController mUiController; @@ -135,13 +140,9 @@ public class MogoServices implements IMogoMapListener, private boolean mIsVertical = false; private MogoReceiver mAIAssistReceiver; - - /** - * 手动刷新策略 - */ - private CustomRefreshStrategy mCustomRefreshStrategy = new CustomRefreshStrategy(); - private float mLastZoomLevel = 0; private RefreshModel mRefreshModel; + + private float mLastZoomLevel = 0; private TtsConfigModleData mTtsModle; private long mRefreshRemainingTime = Long.MAX_VALUE; // 上次手动操作的中心点坐标 @@ -169,7 +170,7 @@ public class MogoServices implements IMogoMapListener, */ private boolean mLoopRequest = false; - private Handler mHandler = new MainLooperHandler( Looper.getMainLooper() ) { + private final Handler mHandler = new MainLooperHandler( Looper.getMainLooper() ) { @Override protected void handleRefreshDecrease( Message msg ) { @@ -255,7 +256,7 @@ public class MogoServices implements IMogoMapListener, /** * 自动刷新回调 */ - private RefreshCallback mAutoRefreshCallback = new RefreshCallback< MarkerResponse >() { + private final RefreshCallback mAutoRefreshCallback = new RefreshCallback< MarkerResponse >() { @Override public void onSuccess( MarkerResponse o ) { MapMarkerManager.getInstance().onSyncMarkerResponse( o ); @@ -285,7 +286,7 @@ public class MogoServices implements IMogoMapListener, */ private int mCurrentLimit = -1; - private IMogoStatusChangedListener statusChangedListener = new StatusChangedAdapter() { + private final IMogoStatusChangedListener statusChangedListener = new StatusChangedAdapter() { @Override public void onSearchUIShow( boolean visible ) { @@ -433,10 +434,10 @@ public class MogoServices implements IMogoMapListener, return; } mRefreshModel.refreshExplorerWayData( ro.mLonLat, ro.mRadius, ro.mAmount, ro.mCallback ); - if ( !DebugConfig. - isNeedUploadCoordinatesDurationInTime() ) { - MapMarkerManager.getInstance().getOnlineCarDataByAutoRefreshStrategy( ro.mLonLat ); - } +// if ( !DebugConfig. +// isNeedUploadCoordinatesDurationInTime() ) { //todo 实时在线车辆需要注释,否则在2D模式下不能展示 +// } + MapMarkerManager.getInstance().getOnlineCarDataByAutoRefreshStrategy( ro.mLonLat ); Logger.i( TAG, "刷新半径 = %s, 点 = %s, zoomLevel = %s, amount = %s", ro.mRadius, ro.mLonLat, mLastZoomLevel, ro.mAmount ); } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java index cddffedaab..4190d57534 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java @@ -547,7 +547,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, getOnlineCarDataImpl( latLng, onlyFocus, onlySameCity, limit, radius, true ); } - private Runnable runnable = new Runnable() { + private final Runnable runnable = new Runnable() { @Override public void run() { getOnlineCarDataImpl( mCarLatLng, false, false, ServiceConst.ONLINE_SEARCH_LIMIT, ServiceConst.ONLINE_SEARCH_RADIUS, false ); @@ -579,9 +579,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener, int radius, boolean fitBounds ) { - if ( DebugConfig.isNeedUploadCoordinatesDurationInTime() ) { - return; - } +// if ( DebugConfig.isNeedUploadCoordinatesDurationInTime() ) {//todo 实时在线车辆需要注释,否则在2D模式下不能展示 +// return; +// } if ( DebugConfig.isDebug() ) { if ( !DebugConfig.isRequestOnlineCarData() ) { From cb1f48785fdddd299a625451ea86a689d5a5c813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Mon, 12 Apr 2021 18:17:52 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B0=8F=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../small/map/SmallMapDirectionView.java | 65 +++---------------- .../main/res/layout/module_small_map_view.xml | 15 ++--- .../src/main/res/values-xhdpi/dimens.xml | 4 +- 3 files changed, 16 insertions(+), 68 deletions(-) diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java index d2ffb31959..d0e3d7c747 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java @@ -4,8 +4,7 @@ import android.content.Context; import android.graphics.BitmapFactory; import android.util.AttributeSet; import android.util.Log; -import android.view.animation.LinearInterpolator; -import android.widget.ImageView; +import android.view.MotionEvent; import android.widget.RelativeLayout; import androidx.annotation.Nullable; @@ -14,16 +13,13 @@ import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdate; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.UiSettings; -import com.amap.api.maps.model.CameraPosition; import com.amap.api.navi.AMapNaviView; import com.amap.api.navi.AMapNaviViewOptions; import com.mogo.commons.AbsMogoApplication; -import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.small.map.animation.DirectionRotateAnimation; import com.mogo.utils.FileUtils; -import java.io.File; import java.io.IOException; /** @@ -35,7 +31,6 @@ import java.io.IOException; public class SmallMapDirectionView extends RelativeLayout { private String styleFilePath = "/mnt/sdcard/amap/small_map_style.data"; - private ImageView mIvMapBorder; private AMapNaviView mAMapNaviView; private DirectionRotateAnimation mRotateAnimation; private int lastAngle = 0; @@ -62,7 +57,6 @@ public class SmallMapDirectionView extends RelativeLayout { mRotateAnimation = new DirectionRotateAnimation(context, null); AbsMogoApplication.getLayoutInflaterNoSkin().inflate(R.layout.module_small_map_view, this); - mIvMapBorder = findViewById(R.id.ivMapBorder); mAMapNaviView = findViewById(R.id.aMapNaviView); mAMapNaviView.onCreate(null); @@ -136,7 +130,7 @@ public class SmallMapDirectionView extends RelativeLayout { options.setNaviArrowVisible(false); // 通过路线是否自动置灰,仅支持驾车导航 options.setAfterRouteAutoGray(false); - //options.setZoom(((int) 9)); + options.setZoom(((int) 7)); //options.setPointToCenter(0.7D, 0.5D); // 2D模式 options.setTilt(0); @@ -151,21 +145,6 @@ public class SmallMapDirectionView extends RelativeLayout { CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); aMap.moveCamera(cameraUpdate); - aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() { - @Override - public void onCameraChange(CameraPosition cameraPosition) { - if (cameraPosition != null) { - //Log.w("onCameraChange", "cameraPosition=" + cameraPosition.bearing); - changeAngle((int) cameraPosition.bearing); - } - } - - @Override - public void onCameraChangeFinish(CameraPosition cameraPosition) { - - } - }); - aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() { @Override @@ -229,46 +208,22 @@ public class SmallMapDirectionView extends RelativeLayout { e.printStackTrace(); } - mIvMapBorder.setOnClickListener( view -> { + setOnClickListener(view -> { MogoApisHandler.getInstance().getApis() .getMapServiceApi() .getMapUIController() .changeMapMode( MogoApisHandler.getInstance() - .getApis() - .getAdasControllerApi() - .getCurrentSkinMode() + .getApis() + .getAdasControllerApi() + .getCurrentSkinMode() ); - } ); + }); } - /** - * 修改角度 - * - * @param angle 角度 0 - 359度旋转,相对于自身中心位置 - */ - public void changeAngle(int angle) { - int tempAngle = 360 - angle; - - if (tempAngle <= 180) { - tempAngle = tempAngle; - } else { - tempAngle = -(360 - tempAngle); - } - - mRotateAnimation.setFromDegrees(lastAngle); - mRotateAnimation.setToDegrees(tempAngle); - - //设置线性插值,可以解决旋转一圈后卡顿问题 - mRotateAnimation.setInterpolator(new LinearInterpolator()); - //设置旋转一圈时间 - mRotateAnimation.setDuration(300); - //控件动画结束时是否保持动画最后的状态 - mRotateAnimation.setFillAfter(true); - mIvMapBorder.startAnimation(mRotateAnimation); - // 刷新最后一次角度 - lastAngle = tempAngle; + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return true; } - } diff --git a/modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml b/modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml index dd0630dcfc..693f7da327 100644 --- a/modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml +++ b/modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml @@ -2,10 +2,10 @@ + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="@dimen/dp_40" + tools:parentTag="RelativeLayout"> - - \ No newline at end of file diff --git a/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml b/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml index abea40f5d9..45bdd66ca6 100644 --- a/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml +++ b/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml @@ -8,8 +8,8 @@ 250px 250px - 1525px - 695px + 1620px + 780px 0px 0px From 6589681d3e8ec37269018ab2cfa7d20cac9ee4ab Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 12 Apr 2021 18:23:45 +0800 Subject: [PATCH 10/12] fix bug of marker draw --- .../main/java/com/mogo/module/common/drawer/MarkerDrawer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java index 45beef469b..9091636736 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java @@ -72,7 +72,7 @@ class MarkerDrawer { if ( markerShowEntity == null || markerShowEntity.getMarkerLocation() == null ) { return null; } - MogoMarkerOptions options = new MogoMarkerOptions().icon3DRes( icon3DRes ).matchOnRoadSide( matchRoadSide ).owner( markerShowEntity.getMarkerType() ).zIndex( zIndex ).object( markerShowEntity ).latitude( markerShowEntity.getMarkerLocation().getLat() ).longitude( markerShowEntity.getMarkerLocation().getLon() ); + MogoMarkerOptions options = new MogoMarkerOptions().icon3DRes( icon3DRes ).set3DMode(MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()).matchOnRoadSide( matchRoadSide ).owner( markerShowEntity.getMarkerType() ).zIndex( zIndex ).object( markerShowEntity ).latitude( markerShowEntity.getMarkerLocation().getLat() ).longitude( markerShowEntity.getMarkerLocation().getLon() ); IMarkerView markerView = MapMarkerAdapter.getMarkerView( AbsMogoApplication.getApp(), markerShowEntity, options ); if ( markerView instanceof OnlineCarMarkerView ) { try { From 3ce1398d0c53965378cec1338af08dce362c07f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Mon, 12 Apr 2021 18:32:30 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=B0=8F?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E9=85=8D=E8=89=B2=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/assets/small_map_style.data | Bin 129331 -> 129331 bytes .../main/assets/small_map_style_extra.data | Bin 3326 -> 3326 bytes .../small/map/SmallMapDirectionView.java | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mogo-module-smp/src/main/assets/small_map_style.data b/modules/mogo-module-smp/src/main/assets/small_map_style.data index f8b175ad2c1d29116ce4d7ba5e88cbb68d8554de..e3775a88b16d9620f9852fa22858e3df518a8c7b 100644 GIT binary patch literal 129331 zcmeHQdyrjqeLv^y-Ryhsz6d15H6#HRNPsLM0Su5V5SDi!1VRYrwF$050)*6{MQrL@ z&|x~|kB&2~V-*Z4h>z)vmcE>hRk45%)M{%7ZEI(=J`lxr++Z%?m2tDzq{uf zc5~0wEPL;M?)Urqec!+5Ip-DMd$!He@E-gn2Ih2!I6V`E#kY#AHdyJ-@?j^i~siT_Xf9am58+ry}S0x@h0{xAky&~?L} z+b8$$<3D$fkJ0D!^_HHogOhhmOzyj#|I#xK(p%^YW1v|mUVdFP@w|D=YJMRs9C7nj|$4N3^GyY28dAq&-Q#}tt#E+Z3uFkIRp59_# z|G?nTD1GF2KmVvVh2Q8O-mk}x&Wa+|;cZJRe#E_AnVOpVKm6OqEWiuj-{=*HHof5w zD&OZyy@ zb~E)%ytbZ&D4@qm0peJ_Oy0tA#qx_xKXc0$<@Pc0?3H^fn@&Gdzs_rEJQUX}RqSSf zNgLUX$Y#(~HuLRdbG)T&9%Id(KrDi5Jinh(Y~Y?^>-AbOlT65o?=N6c7-XegEQW9GKW5tm!jhMubPU0z6QMwh~7B!l}M>dqk3Y}&P7C| z${@-#`Im-TS#1y*v{Rz>Yp6XYWzfrP5yM2k1x-h`%uK|gzI?yWwUn*b*R@^{7RLQE zrzU~^wJcRp*a&`y2h%6zm%kRjPG57^JAiobVj|)jc(AnmBqm=mwFX8D^(~jgy@W|; zp15TwvXqIJh9YEWnKb-UY{Sclc7Tc|97vU7Jbhe##kq837*#KrD%*1&l+{xc138(R zWMLpe{uC?nqDKr|(fX|QD748Fv#0$i+sJ7|o8o;bkwpAGeT-eN&TNfCL~y!^2!!?- zCbT6itzp`guv8aN8xgRCrSq9|=3zvV85Sx#?MUykBfZ;#w3Oi! zOgi&2T!`%xH$doOnj!nkch}DT)>q`{s#KcVy-}Hi%BMLQd>xM`$lG9QQZpt zHyP8v!;HS@_fDp7Rv+!NCBNU6{9RV$C3)P<y1Z_t}wtiyi5=T9B5Y^@mK_AZSS~a6gkbDm30^LtLEa0VZza zm~S_sEfW7D8=(mC!r`5Du@g|d^IGdiGP%dXK&)t^pDvzU5G!L1#zMwuUer$MjvJ`bg{&b zGx3>uzBHPCh7A{m9%0&63VocZ8zqZR*btW`vriK7*}P;X{j(wMXANmTXGr^bL)zamr2TCZ+7fVIVA^p3m;M0rY-Eqtqu#)& z*eXlkrUf4^~TNG*wXHM-hpPJc4{0gAlU211Bm2zZ@XnljL z+UdO6IhLC2!^TF%nYXQ?>r7PgdDe9|wK_ngY$>$PYisY2eQupIZ*A@27$Ms=bF$mH z)xFf}$V!^$XFz@%lP@y)syf$mKVm{8YG2ayKKjt2>9=yzk7M!`Q^{lz{jCA{8z1ax zM_8Cgj_mt2MpAe9^lV@v?lwei^Lp^_%lwa;cN(fza&IM)WNeuIwyl>_yJoGI>~2P0j_#U~j~<83ShXkGs#eZ!nh8e^F`AJ- z$yPW^ZONZ(OCI^qCZuiSTzeXmFAXQo;Wsr!MoqO_NwkscUFdt&FG;j#&_{N`euXXh zvuw#zfH4$~sM5@3&$Vs+YFqMhhR{qn=h?Pijwzb8UZz9L$lqiuoSSXQZ?PqRi!J%B zw&ZWMCBMyQZ-rhir!NEFaGs$@Azsl;GR34XPai;yHcpuP^{nQj@hvA%9rG8H`LUmp)3T_ z*KBVnPlU~dh89SRv%8^3*hYEoFMw~+jexV%NTsFoSfq2IrLy8X7h1|Ie*r>Du`e^- zm*TWk3mJqc(LN`TInh#HOPLcb<=NX=-qOc7O7V&nwRG0TC}}6pYR-Xn@@ns_Zl@F` zy!Jc0)2K9*Cne`XLrAwNe
BsCy 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 P>avN@matr=y@ReEq_2jwYaY&{9*4Zd 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 delta 3264 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 Date: Tue, 13 Apr 2021 11:00:41 +0800 Subject: [PATCH 12/12] fix bug of add Onlinecar in 2Dmap --- .../java/com/mogo/module/common/drawer/MarkerDrawer.java | 9 +++++++++ .../com/mogo/module/common/drawer/OnlineCarDrawer.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java index 9091636736..4cc2bc677c 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java @@ -68,6 +68,15 @@ class MarkerDrawer { return drawMapMarkerImpl( markerShowEntity, matchRoadSide, zIndex, 0, listener ); } + /** + * add marker, {@link OnlineCarDrawer 如果是需要在3D模式下显示,则需要设置 {@link MogoMarkerOptions icon3DRes 资源id}} + * @param markerShowEntity marker展示数据结构体 + * @param matchRoadSide 设置是否道路吸附,暂时没用到这个字段 + * @param zIndex zOrder + * @param icon3DRes 3D Res资源 + * @param listener marker回调 + * @return {@link IMogoMarker} + */ public IMogoMarker drawMapMarkerImpl( MarkerShowEntity markerShowEntity, boolean matchRoadSide, int zIndex, int icon3DRes, IMogoMarkerClickListener listener ) { if ( markerShowEntity == null || markerShowEntity.getMarkerLocation() == null ) { return null; diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/OnlineCarDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/OnlineCarDrawer.java index f4a1dd5756..d72eb87fb5 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/OnlineCarDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/OnlineCarDrawer.java @@ -105,7 +105,7 @@ class OnlineCarDrawer { String sn = MarkerDrawer.getInstance().getPrimaryKeyFromEntity( markerOnlineCar ); IMogoMarker mogoMarker = existCarMap.get( sn ); if ( mogoMarker == null || mogoMarker.isDestroyed() ) { - mogoMarker = MarkerDrawer.getInstance().drawMapMarkerImpl( markerShowEntity, false, MarkerDrawer.MARKER_Z_INDEX_LOW, R.raw.othercar, listener ); + mogoMarker = MarkerDrawer.getInstance().drawMapMarkerImpl( markerShowEntity, false, MarkerDrawer.MARKER_Z_INDEX_LOW, 0, listener ); } if ( mogoMarker != null ) { mogoMarker.setVisible( true );