This commit is contained in:
wangcongtao
2020-05-13 16:32:08 +08:00
parent 8bb106bd03
commit 448323e182
19 changed files with 352 additions and 234 deletions

View File

@@ -3,6 +3,7 @@ package com.mogo.module.service.marker;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
import android.view.animation.BounceInterpolator;
import android.view.animation.OvershootInterpolator;
@@ -257,20 +258,6 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
}
}
/**
* 关闭 Marker 详情
*
* @param marker 要关闭的Marker
*/
public synchronized void closeMarkerSelect( IMogoMarker marker ) {
// 将上次选中 Marker 设置为未选中状态
if ( marker != null ) {
Logger.i( TAG, "closeMarkerSelect 将出Marker详情关闭" + marker );
closeMarker( marker );
mLastCheckMarker = null;
}
}
// 展开气泡
private void openMarker( IMogoMarker mogoMarker ) {
if ( mogoMarker == null ) {
@@ -358,7 +345,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
} else {
mLastCheckMarker = null;
// 清空所有地图上绘制的Marker
MarkerServiceHandler.getMarkerManager().removeMarkers();
MarkerServiceHandler.getMarkerManager().removeMarkersExcept( ModuleNames.CARD_TYPE_USER_DATA );
}
drawMarkerByCurrentType( mLastDataResult );
@@ -402,29 +389,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
mCurrentModuleName = ServiceConst.CARD_TYPE_BUSINESS_OPERATION;
}
List< MarkerOnlineCar > onlineCarList = markerCardResult.getOnlineCar();
List< MarkerExploreWay > exploreWayList = markerCardResult.getExploreWay();
List< MarkerShareMusic > shareMusicList = markerCardResult.getShareMusic();
List< MarkerNoveltyInfo > noveltyInfoList = markerCardResult.getNoveltyInfo();
switch ( mCurrentModuleName ) {
case ServiceConst.CARD_TYPE_BUSINESS_OPERATION:
drawAllMarker( markerCardResult );
break;
case ServiceConst.CARD_TYPE_NOVELTY:
drawNoveltyMarker( noveltyInfoList, ServiceConst.MAX_AMOUNT_SINGLE_CARD );
break;
// case ServiceConst.CARD_TYPE_CARS_CHATTING:
// case ServiceConst.CARD_TYPE_USER_DATA:
// drawOnlineCarMarkers(onlineCarList, ServiceConst.MAX_AMOUNT_SINGLE_CARD);
// break;
case ServiceConst.CARD_TYPE_ROAD_CONDITION:
drawRoadConditionMarker( exploreWayList, ServiceConst.MAX_AMOUNT_SINGLE_CARD );
break;
case ServiceConst.CARD_TYPE_SHARE_MUSIC:
drawShareMusicMarker( shareMusicList, ServiceConst.MAX_AMOUNT_SINGLE_CARD );
break;
}
drawAllMarker( markerCardResult );
}
/**
@@ -457,6 +422,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
double nearlyDistance = Float.MAX_VALUE;
int size = getAppropriateSize( maxAmount, onlineCarList );
Map< String, IMogoMarker > existCarMap = purgeCarsData( onlineCarList );
for ( int i = 0; i < size; i++ ) {
MarkerOnlineCar markerOnlineCar = onlineCarList.get( i );
MarkerLocation markerLocation = markerOnlineCar.getLocation();
@@ -470,9 +438,15 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
markerShowEntity.setIconUrl( markerOnlineCar.getUserInfo().getUserHead() );
}
IMogoMarker iMogoMarker = drawMapMarker( markerShowEntity );
// iMogoMarker.setInfoWindowAdapter(this);
startSmooth( iMogoMarker, markerOnlineCar, markerLocation );
if ( markerOnlineCar.getUserInfo() == null || TextUtils.isEmpty( markerOnlineCar.getUserInfo().getSn() ) ) {
continue;
}
IMogoMarker mogoMarker = existCarMap.get( markerOnlineCar.getUserInfo().getSn() );
if ( mogoMarker == null ) {
Logger.d( TAG, "car [%s] need be create.", markerOnlineCar.getUserInfo().getSn() );
mogoMarker = drawMapMarker( markerShowEntity );
}
startSmooth( mogoMarker, markerOnlineCar, markerLocation );
// 计算在线车辆距离当前车辆的距离,每次都与最后一次距离最近的进行比较,保留距离最近的车辆,进行卡片展示
try {
@@ -489,7 +463,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
// 进行比较,保留最近的一个数据
if ( calculateDistance < nearlyDistance ) {
nearlyDistance = calculateDistance;
mNearlyMarker = iMogoMarker;
mNearlyMarker = mogoMarker;
}
} catch ( Exception e ) {
@@ -519,6 +493,66 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
}
}
/**
* 根据新的在线车辆列表,选出已存在的在线车辆,并从视图和内存中移除不存在的在线车辆
*
* @param newCarsList
* @return
*/
private Map< String, IMogoMarker > purgeCarsData( List< MarkerOnlineCar > newCarsList ) {
final long start = System.currentTimeMillis();
Map< String, IMogoMarker > existCarsMap = new HashMap<>();
List< IMogoMarker > allCarsList = MarkerServiceHandler.getMarkerManager().getMarkers( ModuleNames.CARD_TYPE_USER_DATA );
if ( allCarsList == null || allCarsList.isEmpty() ) {
return existCarsMap;
}
if ( newCarsList == null || newCarsList.isEmpty() ) {
return existCarsMap;
}
Map< String, IMogoMarker > allCarsMap = new HashMap<>();
for ( IMogoMarker marker : allCarsList ) {
String sn = getCarSnFromMarker( marker );
Logger.d( TAG, "sn = [%s]", sn );
allCarsMap.put( sn, marker );
}
for ( MarkerOnlineCar markerOnlineCar : newCarsList ) {
String sn = markerOnlineCar.getUserInfo().getSn();
if ( allCarsMap.containsKey( sn ) ) {
Logger.d( TAG, " car [%s] is cached.", sn );
existCarsMap.put( sn, allCarsMap.get( sn ) );
}
}
for ( String sn : allCarsMap.keySet() ) {
if ( !existCarsMap.containsKey( sn ) ) {
IMogoMarker dirtyMarker = allCarsMap.get( sn );
allCarsList.remove( dirtyMarker );
dirtyMarker.destroy();
Logger.d( TAG, " car [%s] is destroy.", sn );
}
}
allCarsMap.clear();
Logger.i( "timer", "purge data cost " + ( System.currentTimeMillis() - start ) + "ms" );
return existCarsMap;
}
private String getCarSnFromMarker( IMogoMarker marker ) {
if ( marker == null || marker.getObject() == null || marker.isDestroyed() ) {
return null;
}
if ( !( marker.getObject() instanceof MarkerShowEntity ) ) {
return null;
}
if ( !( ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() instanceof MarkerOnlineCar ) ) {
return null;
}
if ( ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo() == null ) {
return null;
}
return ( ( MarkerOnlineCar ) ( ( MarkerShowEntity ) marker.getObject() ).getBindObj() ).getUserInfo().getSn();
}
/**
* 探路数据
*
@@ -869,7 +903,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
if ( result == null ) {
return;
}
removeCarMarkers();
List< MarkerOnlineCar > onlineCarList = result.getOnlineCar();
if ( !MarkerServiceHandler.getMogoStatusManager().isADASShow() ) {
dispatchDataToBis( ServiceConst.CARD_TYPE_USER_DATA, onlineCarList == null ? new ArrayList<>() : onlineCarList );