From 443cf9b8cb151a0adbe3c9f8126f6cd8d5e1af91 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 10 Mar 2021 11:37:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=98=BE=E7=A4=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/map-custom/build.gradle | 2 +- .../impl/custom/marker/AMapMarkerWrapper.java | 31 ++++++++++- .../custom/utils/PointInterpolatorUtil.java | 29 ---------- .../main/java/com/mogo/map/MogoLatLng.java | 11 ---- .../drawer/AdasRecognizedResultDrawer.java | 37 +++++++------ .../mogo/module/common/drawer/BaseDrawer.java | 21 +++++-- .../common/utils/SimpleHandlerThreadPool.java | 4 +- .../src/main/res/drawable/sr.png | Bin 0 -> 145 bytes .../src/main/res/drawable/sy.png | Bin 0 -> 145 bytes .../src/main/assets/loc3.txt | 1 + .../service/intent/MockIntentHandler.java | 52 +++++++++++++++++- 11 files changed, 118 insertions(+), 70 deletions(-) create mode 100644 modules/mogo-module-common/src/main/res/drawable/sr.png create mode 100644 modules/mogo-module-common/src/main/res/drawable/sy.png create mode 100644 modules/mogo-module-service/src/main/assets/loc3.txt diff --git a/libraries/map-custom/build.gradle b/libraries/map-custom/build.gradle index a32f01a3ab..66f58cc70e 100644 --- a/libraries/map-custom/build.gradle +++ b/libraries/map-custom/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation project(':foudations:mogo-commons') } - implementation 'com.zhidaoauto.machine:map:1.0.0-vr-8.2.4' + implementation 'com.zhidaoauto.machine:map:1.0.0-vr-8.2.6' // implementation 'com.zhidaoauto.machine:map:1.0.0-vr-test-3.4' } diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java index 0cfcc55f66..160edc19e2 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java @@ -468,7 +468,7 @@ public class AMapMarkerWrapper implements IMogoMarker, Observer { return; } - List< LonLatPoint > newPoints = new ArrayList<>(); + ArrayList< LonLatPoint > newPoints = new ArrayList<>(); for ( int i = 0; i < points.size(); i++ ) { LonLatPoint point = ObjectUtils.fromMogo( points.get( i ) ); if ( point == null ) { @@ -480,6 +480,35 @@ public class AMapMarkerWrapper implements IMogoMarker, Observer { return; } + +// MarkerTranslateAnimation animation = new MarkerTranslateAnimation( newPoints ); +// animation.setDuration( duration ); +// animation.setAnimationListener( new MarkerAnimationListener() { +// @Override +// public void onAnimationStart( @NotNull Animation animation ) { +// +// } +// +// @Override +// public void onAnimationEnd( @NotNull Animation animation ) { +// +// } +// +// long lastTime = 0L; +// +// @Override +// public void onAnimationRepeat( @NotNull Animation animation ) { +// if ( lastTime == 0L ) { +// lastTime = System.currentTimeMillis(); +// return; +// } +// Logger.d( TAG, "frame cost = %s", System.currentTimeMillis() - lastTime ); +// lastTime = System.currentTimeMillis(); +// } +// } ); +// mMarker.setTranslateAnimation( animation ); +// mMarker.startAnimation(); + mMarker.startSmooth( newPoints, ( int ) duration ); // mMarker.addDynamicAnchorPostion( newPoints.get( newPoints.size() - 1 ), ( int ) duration ); } diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java index 0b7996bd1e..342827642c 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java @@ -17,35 +17,6 @@ public class PointInterpolatorUtil { private static final String TAG = "PointInterpolatorUtil"; private static final int DISTANCE_THRESHOLD = 2; - /** - * 在两点之间插值 - * - * @param start - * @param end - * @param frameInterval - * @return - */ - public static List< MogoLatLng > interpolate( MogoLatLng start, MogoLatLng end, long frameInterval ) { - if ( start == null || end == null ) { - return null; - } - long locInterval = end.time - start.time; - int interpolateFrame = ( int ) ( locInterval / frameInterval ) - 1; - List< MogoLatLng > arrayList = new ArrayList<>(); - arrayList.add( start ); - if ( interpolateFrame > 0 ) { - double lonStep = ( end.lon - start.lon ) / ( interpolateFrame + 1 ); - double latStep = ( end.lat - start.lat ) / ( interpolateFrame + 1 ); - for ( int i = 0; i < interpolateFrame; i++ ) { - double lon = start.lon + lonStep * ( i + 1 ); - double lat = start.lat + latStep * ( i + 1 ); - arrayList.add( new MogoLatLng( lon, lat ) ); - } - } - arrayList.add( end ); - return arrayList; - } - /** * 在(x1,y1) (x2,y2)中间插入一些点,使每两个点之间距离<={@link #DISTANCE_THRESHOLD},利用如下公式进行计算 * xn = x1 + (x2 - x1)*n/a diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoLatLng.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoLatLng.java index 8c6a682513..5c7629e2f1 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoLatLng.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoLatLng.java @@ -17,7 +17,6 @@ public class MogoLatLng implements Parcelable { @Deprecated public final double lng; public final double lon; - public long time; public MogoLatLng( double lat, double lon ) { this.lat = lat; @@ -43,14 +42,6 @@ public class MogoLatLng implements Parcelable { return lon; } - public long getTime() { - return time; - } - - public void setTime( long time ) { - this.time = time; - } - @Override public boolean equals( Object o ) { if ( this == o ) return true; @@ -83,14 +74,12 @@ public class MogoLatLng implements Parcelable { dest.writeDouble( this.lat ); dest.writeDouble( this.lng ); dest.writeDouble( this.lon ); - dest.writeLong( this.time ); } protected MogoLatLng( Parcel in ) { this.lat = in.readDouble(); this.lng = in.readDouble(); this.lon = in.readDouble(); - this.time = in.readLong(); } public static final Creator< MogoLatLng > CREATOR = new Creator< MogoLatLng >() { diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java index 15a5afa01f..c0ef90267f 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java @@ -1,6 +1,7 @@ package com.mogo.module.common.drawer; import android.content.Context; +import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.text.TextUtils; @@ -60,7 +61,7 @@ class AdasRecognizedResultDrawer extends BaseDrawer { } } else if ( msg.what == MSG_SET_POINT ) { if ( msg.obj instanceof MovingPoint ) { - moveMarker( ( ( MovingPoint ) msg.obj ) ); + moveMarker( ( ( MovingPoint ) msg.obj ), msg.arg1 ); } } else if ( msg.what == MSG_SET_SPEED ) { if ( msg.obj instanceof SpeedData ) { @@ -82,6 +83,11 @@ class AdasRecognizedResultDrawer extends BaseDrawer { Message msg = Message.obtain(); msg.what = MSG_SET_POINT; msg.obj = points.get( i ); + if ( i == 0 || i == points.size() - 1 ) { + msg.arg1 = R.drawable.sr; + } else { + msg.arg1 = R.drawable.sy; + } mPointSettingHandler.sendMessageDelayed( msg, points.get( i ).delay ); } } @@ -91,7 +97,7 @@ class AdasRecognizedResultDrawer extends BaseDrawer { * * @param pointData */ - private void moveMarker( MovingPoint pointData ) { + private void moveMarker( MovingPoint pointData, int drId ) { if ( pointData == null ) { return; } @@ -215,34 +221,29 @@ class AdasRecognizedResultDrawer extends BaseDrawer { } newAdasRecognizedMarkersCaches.put( uniqueKey, marker ); if ( lastPosition != null ) { - MogoLatLng endLatLon = new MogoLatLng( recognizedListResult.lat, recognizedListResult.lon ); long interval = computeAnimDuration( lastPosition.systemTime, recognizedListResult.systemTime, lastPosition.satelliteTime, recognizedListResult.satelliteTime ); - long cost = System.currentTimeMillis() - start; - interval -= cost; - MogoLatLng lastPoint = new MogoLatLng( lastPosition.lat, lastPosition.lon ); - lastPoint.setTime( lastPosition.satelliteTime ); - endLatLon.setTime( recognizedListResult.satelliteTime ); - MovingPoint endPoint = new MovingPoint(); - endPoint.point = endLatLon; - endPoint.marker = marker; - endPoint.delay = interval; - endPoint.angle = ( float ) recognizedListResult.heading; - MovingPoint startPoint = new MovingPoint(); - startPoint.point = lastPoint; + startPoint.point = new MogoLatLng( lastPosition.lat, lastPosition.lon ); startPoint.marker = marker; startPoint.delay = 0L; startPoint.angle = ( float ) lastPosition.heading; - List< MovingPoint > points = interpolate( startPoint, endPoint, 30, interval ); + + long cost = System.currentTimeMillis() - start; + MovingPoint endPoint = new MovingPoint(); + endPoint.point = new MogoLatLng( recognizedListResult.lat, recognizedListResult.lon ); + endPoint.marker = marker; + endPoint.angle = ( float ) recognizedListResult.heading; + interval -= cost; + endPoint.delay = interval; + + List< MovingPoint > points = interpolate( startPoint, endPoint, interval ); Message msg = new Message(); MovingPoints obj = new MovingPoints(); obj.points = points; msg.obj = obj; msg.what = MSG_POINTS_SETTING; mPointSettingHandler.sendMessage( msg ); -// marker.startSmoothInMs( points, interval ); -// marker.addDynamicAnchorPosition( endLatLon, interval ); Logger.d( TAG, "anim duration: %s, points size = %s", interval, points.size() ); } else { marker.setRotateAngle( ( ( float ) recognizedListResult.heading ) ); diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java index ff51fcbc89..8bd6c7ad59 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java @@ -38,6 +38,11 @@ class BaseDrawer { public static final int MSG_REMOVE_DIRTY_MARKERS = 9990; public static final int MSG_REMOVE_ADAS_MARKERS = 9992; + /** + * 地图刷新频率 + */ + public static final int MAP_RENDER_FRAME_FREQUENCY = 25; + /** * 地图内部资源md5缓存,便于资源复用 */ @@ -234,20 +239,26 @@ class BaseDrawer { * * @param start * @param end - * @param frameInterval * @return */ - public static List< MovingPoint > interpolate( MovingPoint start, MovingPoint end, long frameInterval, long duration ) { + public static List< MovingPoint > interpolate( MovingPoint start, MovingPoint end, long duration ) { if ( start == null || end == null ) { return null; } - int interpolateFrame = ( int ) ( duration / frameInterval ) - 1; + + int interpolateFrame = ( int ) ( duration / MAP_RENDER_FRAME_FREQUENCY ); + if ( duration % MAP_RENDER_FRAME_FREQUENCY < MAP_RENDER_FRAME_FREQUENCY / 2 ) { + interpolateFrame -= 1; + } +// if ( interpolateFrame == 0 ) { +// interpolateFrame = 1; +// } List< MovingPoint > arrayList = new ArrayList<>(); double _angle = ( end.angle + start.angle ) / 2; if ( Math.abs( end.angle - start.angle ) > 5 ) { _angle = Math.atan2( Math.abs( start.point.lon - end.point.lon ), Math.abs( start.point.lat - end.point.lat ) ) * ( 180 / PI ); } - arrayList.add( start ); +// arrayList.add( start ); if ( interpolateFrame > 0 ) { double lonStep = ( end.point.lon - start.point.lon ) / ( interpolateFrame + 1 ); double latStep = ( end.point.lat - start.point.lat ) / ( interpolateFrame + 1 ); @@ -256,7 +267,7 @@ class BaseDrawer { double lat = start.point.lat + latStep * ( i + 1 ); MovingPoint pd = new MovingPoint(); pd.point = new MogoLatLng( lat, lon ); - pd.delay = ( i + 1 ) * frameInterval; + pd.delay = ( i + i ) * MAP_RENDER_FRAME_FREQUENCY; pd.angle = ( float ) _angle; pd.marker = start.marker; arrayList.add( pd ); diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java index efe6e6d94c..652c99ef7b 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java @@ -224,8 +224,6 @@ public class SimpleHandlerThreadPool { MogoLatLng endLatLon = new MogoLatLng( cloudRoadData.getWgslat(),cloudRoadData.getWgslon() ); long interval = SnapshotSetDataDrawer.getInstance().computeAnimDuration( lastPosition.getSystemTime(), cloudRoadData.getSystemTime(), lastPosition.getSatelliteTime(), cloudRoadData.getSatelliteTime() ); MogoLatLng lastPoint = new MogoLatLng( lastPosition.getWgslat(), lastPosition.getWgslon() ); - lastPoint.setTime( lastPosition.getSatelliteTime() ); - endLatLon.setTime( cloudRoadData.getSatelliteTime() ); BaseDrawer.MovingPoint endPoint = new BaseDrawer.MovingPoint(); endPoint.point = endLatLon; endPoint.marker = marker; @@ -235,7 +233,7 @@ public class SimpleHandlerThreadPool { startPoint.point = lastPoint; startPoint.marker = marker; startPoint.angle = ( float ) lastPosition.getHeading(); - List< BaseDrawer.MovingPoint > points = BaseDrawer.interpolate( startPoint, endPoint, 20, interval ); + List< BaseDrawer.MovingPoint > points = BaseDrawer.interpolate( startPoint, endPoint, interval ); Message msg = new Message(); BaseDrawer.MovingPoints obj = new BaseDrawer.MovingPoints(); obj.points = points; diff --git a/modules/mogo-module-common/src/main/res/drawable/sr.png b/modules/mogo-module-common/src/main/res/drawable/sr.png new file mode 100644 index 0000000000000000000000000000000000000000..2836c8de0996c24b772b565dfcfc9fd4bb95a43f GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=7>k44ofy`glX(f`cze1yhH%Ix z|G6Ld^yG)n*VokB?>GGO|F?4Q)BCrlZ~pi1kJjh^&-vT_@2@|X^z-XCP3FVr-}C%$ u`0;<5~ literal 0 HcmV?d00001 diff --git a/modules/mogo-module-common/src/main/res/drawable/sy.png b/modules/mogo-module-common/src/main/res/drawable/sy.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce0a5dbbc51f2efefd3577a2641b99c5bb7efa8 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=7>k44ofy`glX(f`cze1yhH%L8 zo^a%CFyLXmVBf^UlbCXx(}8Q7fx{u04O3J8=H7f58`t&w#=3V-uvh$}JZJk%|^~kWzdi?_hps@^|u6{1-oD!M latLngs = new ArrayList<>( ); + latLngs.add( new MogoLatLng( 39.981971055705,116.41150648393 ) ); + latLngs.add( new MogoLatLng( 39.981990561932,116.412893641626 ) ); + marker.startSmoothInMs(latLngs, 20_000L ); + break; + } } @@ -647,6 +665,17 @@ public class MockIntentHandler implements IntentHandler { } br5 = null; } + } else if ( msg.what == 48 ) { + try { + handleMockLocationIntent48(); + } catch ( Exception e ) { + try { + br48.close(); + } catch ( IOException ex ) { + ex.printStackTrace(); + } + br48 = null; + } } } }; @@ -669,6 +698,25 @@ public class MockIntentHandler implements IntentHandler { return true; } + private BufferedReader br48; + int count = 0; + + private boolean handleMockLocationIntent48() throws Exception { + if ( br48 == null ) { + br48 = new BufferedReader( new InputStreamReader( AbsMogoApplication.getApp().getAssets().open( "loc3.txt" ) ) ); + } + final long start = System.currentTimeMillis(); + String line = br48.readLine(); + if ( line == null ) { + throw new Exception( "end of file." ); + } + JSONObject jo = new JSONObject( line ); + MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map( jo ); + Logger.i( "mock-timer-loc", "cost " + ( System.currentTimeMillis() - start ) + "ms: count=%s", ++count ); + mLocationMockHandler.sendEmptyMessageDelayed( 48, 100L ); + return true; + } + private BufferedReader br2; private boolean handleMockSnapshotIntent() throws Exception { @@ -688,8 +736,8 @@ public class MockIntentHandler implements IntentHandler { // double[] coor = CoordinateUtils.transformWgsToGcj( cloudRoadData.getLat(), cloudRoadData.getLon() ); // cloudRoadData.setLon( coor[0] ); // cloudRoadData.setLat( coor[1] ); - cloudRoadData.setWgslat(cloudRoadData.getLat()); - cloudRoadData.setWgslon(cloudRoadData.getLon()); + cloudRoadData.setWgslat( cloudRoadData.getLat() ); + cloudRoadData.setWgslon( cloudRoadData.getLon() ); allList.add( cloudRoadData ); data.setAllList( allList );