diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1c3cce9e33..e55f301423 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
+ * 描述
+ */
+public class DemoConstants {
+
+ public static final String TAG = MogoModulePaths.PATH_MODULE_DEMO;
+}
diff --git a/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoInfoWindowAdapter.java b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoInfoWindowAdapter.java
new file mode 100644
index 0000000000..300d735910
--- /dev/null
+++ b/demo/demo-module-map/src/main/java/com/mogo/demo/module/map/DemoInfoWindowAdapter.java
@@ -0,0 +1,48 @@
+package com.mogo.demo.module.map;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.mogo.map.marker.IMogoInfoWindowAdapter;
+import com.mogo.map.marker.IMogoMarker;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author congtaowang
+ * @since 2019-12-24
+ *
+ * 描述
+ */
+public class DemoInfoWindowAdapter implements IMogoInfoWindowAdapter {
+
+ private Context mContext;
+
+ public DemoInfoWindowAdapter( Context mContext ) {
+ this.mContext = mContext;
+ }
+
+ @Override
+ public View getInfoWindow( IMogoMarker marker ) {
+ View view = LayoutInflater.from( mContext ).inflate( R.layout.demo_module_demo_info_window, null );
+ renderView( view, marker );
+ return view;
+ }
+
+ private void renderView( View view, final IMogoMarker marker ) {
+ final TextView time = view.findViewById( R.id.demo_module_id_iw_time );
+ Button refresh = view.findViewById( R.id.demo_module_id_iw_refresh );
+ time.setText( new SimpleDateFormat( "yyyyMMdd HHMMSS" ).format( new Date() ) );
+ refresh.setOnClickListener( new View.OnClickListener() {
+ @Override
+ public void onClick( View v ) {
+ marker.showInfoWindow();
+ }
+ } );
+ }
+}
+
diff --git a/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml b/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml
index e0a6bb02ac..218df1fe68 100644
--- a/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml
+++ b/demo/demo-module-map/src/main/res/layout/demo_module_card_view.xml
@@ -6,7 +6,7 @@
android:background="#ff0000">
+ * 自定义infowindow + */ +public final class AMapInfoWindowAdapter implements AMap.InfoWindowAdapter { + + @Override + public View getInfoWindow( Marker marker ) { + if ( marker.getObject() instanceof IMogoMarker ) { + IMogoMarker mogoMarker = ( ( IMogoMarker ) marker.getObject() ); + IMogoInfoWindowAdapter delegate = mogoMarker.getInfoWindowAdapter(); + if ( delegate != null ) { + return delegate.getInfoWindow( mogoMarker ); + } + } + + return null; + } + + @Override + public View getInfoContents( Marker marker ) { + return null; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/amap/marker/AMapMarkerWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/amap/marker/AMapMarkerWrapper.java index 91c5eba06f..2fa2bd5073 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/amap/marker/AMapMarkerWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/amap/marker/AMapMarkerWrapper.java @@ -8,6 +8,7 @@ import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.mogo.map.MogoLatLng; +import com.mogo.map.marker.IMogoInfoWindowAdapter; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.MogoMarkerOptions; @@ -26,10 +27,14 @@ public class AMapMarkerWrapper implements IMogoMarker { private Marker mMarker; private Object mObject; private IMogoMarkerClickListener mMogoMarkerClickListener; + private IMogoInfoWindowAdapter mMogoInfoWindowAdapter; + + private boolean mIsDestroy = false; public AMapMarkerWrapper( Marker mMarker ) { this.mMarker = mMarker; if ( mMarker != null ) { + // 设置高德 marker 的object对象为 IMogoMarker 实例。!!!! mMarker.setObject( this ); } } @@ -38,14 +43,18 @@ public class AMapMarkerWrapper implements IMogoMarker { public void destroy() { if ( mMarker != null ) { mMarker.destroy(); + mMarker.setObject( null ); + mMarker = null; } + mMogoInfoWindowAdapter = null; + mMogoMarkerClickListener = null; + mObject = null; + mIsDestroy = true; } @Override public void remove() { - if ( mMarker != null ) { - mMarker.remove(); - } + destroy(); } @Override @@ -216,4 +225,19 @@ public class AMapMarkerWrapper implements IMogoMarker { public IMogoMarkerClickListener getOnMarkerClickListener() { return mMogoMarkerClickListener; } + + @Override + public void setInfoWindowAdapter( IMogoInfoWindowAdapter adapter ) { + mMogoInfoWindowAdapter = adapter; + } + + @Override + public IMogoInfoWindowAdapter getInfoWindowAdapter() { + return mMogoInfoWindowAdapter; + } + + @Override + public boolean isDestroyed() { + return mIsDestroy; + } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/marker/IMogoInfoWindowAdapter.java b/libraries/mogo-map/src/main/java/com/mogo/map/marker/IMogoInfoWindowAdapter.java new file mode 100644 index 0000000000..0567375e0f --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/marker/IMogoInfoWindowAdapter.java @@ -0,0 +1,14 @@ +package com.mogo.map.marker; + +import android.view.View; + +/** + * @author congtaowang + * @since 2019-12-24 + *
+ * 自定义 infowindow 适配器 + */ +public interface IMogoInfoWindowAdapter { + + View getInfoWindow( IMogoMarker marker ); +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/marker/IMogoMarker.java b/libraries/mogo-map/src/main/java/com/mogo/map/marker/IMogoMarker.java index ac19d743b8..fd6c467c77 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/marker/IMogoMarker.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/marker/IMogoMarker.java @@ -160,4 +160,15 @@ public interface IMogoMarker { * @return */ IMogoMarkerClickListener getOnMarkerClickListener(); + + /** + * 设置自定义infowindow代理对象 + * + * @param adapter + */ + void setInfoWindowAdapter( IMogoInfoWindowAdapter adapter ); + + IMogoInfoWindowAdapter getInfoWindowAdapter(); + + boolean isDestroyed(); } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java b/libraries/mogo-map/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java new file mode 100644 index 0000000000..b113bc0409 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java @@ -0,0 +1,89 @@ +package com.mogo.map.marker; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author congtaowang + * @since 2019-12-24 + *
+ * 管理地图上的所有marker + */ +public class MogoMarkersHandler { + + private static volatile MogoMarkersHandler sInstance; + + public static MogoMarkersHandler getInstance() { + if ( sInstance == null ) { + synchronized ( MogoMarkersHandler.class ) { + if ( sInstance == null ) { + sInstance = new MogoMarkersHandler(); + } + } + } + return sInstance; + } + + private Map< String, List< IMogoMarker > > mServicesMarkers = new HashMap<>(); + + private MogoMarkersHandler() { + } + + public synchronized void release() { + sInstance = null; + } + + public synchronized void removeAll() { + final Collection< List< IMogoMarker > > mogoMarkers = mServicesMarkers.values(); + for ( List< IMogoMarker > mogoMarkerList : mogoMarkers ) { + if ( mogoMarkerList != null && !mogoMarkerList.isEmpty() ) { + for ( IMogoMarker mogoMarker : mogoMarkerList ) { + try { + mogoMarker.destroy(); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + } + } + mServicesMarkers.clear(); + } + + public synchronized void remove( String tag ) { + List< IMogoMarker > mogoMarkerList = mServicesMarkers.remove( tag ); + if ( mogoMarkerList != null && !mogoMarkerList.isEmpty() ) { + for ( IMogoMarker mogoMarker : mogoMarkerList ) { + try { + mogoMarker.destroy(); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + mogoMarkerList.clear(); + } + } + + + public synchronized void add( String tag, IMogoMarker marker ) { + if ( marker == null ) { + return; + } + if ( !mServicesMarkers.containsKey( tag ) ) { + mServicesMarkers.put( tag, new ArrayList< IMogoMarker >() ); + } + mServicesMarkers.get( tag ).add( marker ); + } + + public synchronized void add( String tag, List< IMogoMarker > markers ) { + if ( markers == null || markers.isEmpty() ) { + return; + } + if ( !mServicesMarkers.containsKey( tag ) ) { + mServicesMarkers.put( tag, new ArrayList< IMogoMarker >() ); + } + mServicesMarkers.get( tag ).addAll( markers ); + } +} diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java index 2634b4e76e..445fab2b90 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java @@ -27,7 +27,7 @@ import java.util.List; public interface IMogoMapService extends IProvider, IMogoMapListenerRegister { /** - * 获取定位服务实例 + * 获取定位服务实例,全局唯一 * * @param context * @return @@ -37,18 +37,20 @@ public interface IMogoMapService extends IProvider, IMogoMapListenerRegister { /** * 添加marker * + * @param tag 标识调用者 * @param options * @return */ - IMogoMarker addMarker( MogoMarkerOptions options ); + IMogoMarker addMarker( String tag, MogoMarkerOptions options ); /** * 添加多个marker * + * @param tag 标识调用者 * @param options * @return */ - List< IMogoMarker > addMarkers( ArrayList< MogoMarkerOptions > options, boolean moveToCenter ); + List< IMogoMarker > addMarkers( String tag, ArrayList< MogoMarkerOptions > options, boolean moveToCenter ); /** * 获取关键字搜索地址服务 @@ -87,4 +89,16 @@ public interface IMogoMapService extends IProvider, IMogoMapListenerRegister { * @return */ IMogoPoiSearch getPoiSearch( Context context, MogoPoiSearchQuery query ); + + /** + * 移除某一个类、某个模块的markers + * + * @param tag + */ + void removeMarkers( String tag ); + + /** + * 移除地图上所有markers + */ + void removeMarkers(); } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java b/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java index 577aeb5428..17113e8a7e 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java @@ -8,7 +8,9 @@ import com.mogo.map.listener.MogoMapListenerHandler; import com.mogo.map.location.IMogoLocationClient; import com.mogo.map.location.MogoLocationClient; import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.MogoMarker; import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.map.marker.MogoMarkersHandler; import com.mogo.map.search.geo.IMogoGeoSearch; import com.mogo.map.search.inputtips.IMogoInputtipsSearch; import com.mogo.map.search.geo.MogoGeoSearch; @@ -39,18 +41,18 @@ public class MogoMapService implements IMogoMapService { } @Override - public IMogoMarker addMarker( MogoMarkerOptions options ) { + public IMogoMarker addMarker( String tag, MogoMarkerOptions options ) { try { - return MogoMap.getInstance().getMogoMap().addMarker( options ); + return MogoMap.getInstance().getMogoMap().addMarker( tag, options ); } catch ( Exception e ) { return null; } } @Override - public List< IMogoMarker > addMarkers( ArrayList< MogoMarkerOptions > options, boolean moveToCenter ) { + public List< IMogoMarker > addMarkers( String tag, ArrayList< MogoMarkerOptions > options, boolean moveToCenter ) { try { - return MogoMap.getInstance().getMogoMap().addMarkers( options, moveToCenter ); + return MogoMap.getInstance().getMogoMap().addMarkers( tag, options, moveToCenter ); } catch ( Exception e ) { return null; } @@ -81,6 +83,16 @@ public class MogoMapService implements IMogoMapService { return new MogoPoiSearch( context, query ); } + @Override + public void removeMarkers( String tag ) { + MogoMarkersHandler.getInstance().remove( tag ); + } + + @Override + public void removeMarkers() { + MogoMarkersHandler.getInstance().removeAll(); + } + @Override public void init( Context context ) {