diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index 3bb667fda2..c9bb2505b9 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -533,6 +533,18 @@ public class AMapNaviViewWrapper implements IMogoMapView, return null; } + @Override + public MogoLatLng getLocationMogoLatLngInScreen(Point point) { + if ( checkAMapView() ) { + try { + return ObjectUtils.fromAMap(mMapView.getMap().getProjection().fromScreenLocation( point )); + } catch ( Exception e ) { + return null; + } + } + return null; + } + @Override public void startJumpAnimation( IMogoMarker marker, float high, Interpolator interpolator, long duration ) { if ( marker == null || high <= 0.0f || interpolator == null || duration < 0 ) { diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java index c36b011c69..c811a6860f 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java @@ -1,14 +1,18 @@ package com.mogo.map.impl.amap.marker; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Point; import android.view.View; +import android.view.animation.Interpolator; import com.amap.api.maps.model.BitmapDescriptor; import com.amap.api.maps.model.BitmapDescriptorFactory; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; +import com.amap.api.maps.model.animation.Animation; +import com.amap.api.maps.model.animation.TranslateAnimation; import com.mogo.map.MogoLatLng; import com.mogo.map.impl.amap.utils.ObjectUtils; import com.mogo.map.marker.IMogoInfoWindowAdapter; @@ -16,6 +20,8 @@ import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.IMogoMarkerIconViewCreator; import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.utils.WindowUtils; +import com.mogo.utils.logger.Logger; import java.util.ArrayList; import java.util.Observable; @@ -29,6 +35,8 @@ import java.util.Observer; */ public class AMapMarkerWrapper implements IMogoMarker, Observer { + private final String TAG = AMapMarkerWrapper.class.getName(); + private Marker mMarker; private Object mObject; private IMogoMarkerClickListener mMogoMarkerClickListener; diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java index 0df050bb3d..72da50a6ba 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java @@ -156,6 +156,14 @@ public class AMapUIController implements IMogoMapUIController { return null; } + @Override + public MogoLatLng getLocationMogoLatLngInScreen(Point point) { + if ( mClient != null ) { + return mClient.getLocationMogoLatLngInScreen( point ); + } + return null; + } + @Override public void startJumpAnimation( IMogoMarker marker, float high, Interpolator interpolator, long duration ) { if ( mClient != null ) { diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java index 881ff0fbc9..9eeca2123d 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java @@ -1,7 +1,9 @@ package com.mogo.map.marker; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Point; +import android.view.animation.Interpolator; import com.mogo.map.MogoLatLng; diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index 4d269020d1..8b854d2844 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -115,6 +115,14 @@ public interface IMogoMapUIController { */ Point getLocationPointInScreen( MogoLatLng latLng ); + /** + * 获取像素点对应的经纬度 + * + * @param point + * @return + */ + MogoLatLng getLocationMogoLatLngInScreen( Point point ); + /** * marker 跳跃动画 * diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java index d664bb8a22..05634e5b08 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java @@ -149,6 +149,14 @@ public class MogoMapUIController implements IMogoMapUIController { return null; } + @Override + public MogoLatLng getLocationMogoLatLngInScreen(Point point) { + if (mDelegate != null) { + return mDelegate.getLocationMogoLatLngInScreen(point); + } + return null; + } + @Override public void startJumpAnimation( IMogoMarker marker, float high, Interpolator interpolator, long duration ) { if ( mDelegate != null ) { 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 2b854906ef..85172a947d 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 @@ -1,12 +1,18 @@ package com.mogo.module.service.marker; import android.content.Context; +import android.graphics.Point; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; -import android.view.View; +import android.view.animation.Interpolator; +import com.amap.api.maps.model.LatLng; +import com.amap.api.maps.model.animation.Animation; +import com.amap.api.maps.model.animation.TranslateAnimation; import com.mogo.map.MogoLatLng; +import com.mogo.map.impl.amap.marker.AMapMarkerWrapper; +import com.mogo.map.impl.amap.utils.ObjectUtils; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.MogoMarkerOptions; @@ -27,6 +33,7 @@ import com.mogo.module.service.Utils; import com.mogo.module.service.datamanager.MogoDataHandler; import com.mogo.service.cardmanager.IMogoCardChangedListener; import com.mogo.service.connection.IMogoOnMessageListener; +import com.mogo.utils.WindowUtils; import com.mogo.utils.logger.Logger; import org.json.JSONArray; @@ -49,7 +56,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, IMogoOnMessag // 第一次请求到地图的Marker数据 private boolean isFirstMarker = true; private boolean isOnLineCard = false; - private Context mContext; + private static Context mContext; private static IMogoMarker lastMarker; private static MapMarkerManager mMarkerManager; @@ -191,30 +198,60 @@ public class MapMarkerManager implements IMogoMarkerClickListener, IMogoOnMessag public synchronized static void highlightedMarker(final String typeTag) { try { - if ( TextUtils.equals( mLastHighLightModule, typeTag ) ) { + if (TextUtils.equals(mLastHighLightModule, typeTag)) { return; } // 上一次高亮的变暗 - List lastHighLightList = MarkerServiceHandler.getMarkerManager().getMarkers( mLastHighLightModule ); + List lastHighLightList = MarkerServiceHandler.getMarkerManager().getMarkers(mLastHighLightModule); setMarkersAlpha(lastHighLightList, 0.7f); // 将当前高亮 - List currentHighLightList = MarkerServiceHandler.getMarkerManager().getMarkers( typeTag ); + List currentHighLightList = MarkerServiceHandler.getMarkerManager().getMarkers(typeTag); setMarkersAlpha(currentHighLightList, 1f); } catch (Exception e) { e.printStackTrace(); } } - private static void setMarkersAlpha(List markers,float alpha){ - if ( markers == null || markers.isEmpty() ) { + private static void setMarkersAlpha(List markers, float alpha) { + if (markers == null || markers.isEmpty()) { return; } - for ( IMogoMarker mogoMarker : markers ) { - if ( mogoMarker == null || mogoMarker.isDestroyed() ) { + for (IMogoMarker mogoMarker : markers) { + if (mogoMarker == null || mogoMarker.isDestroyed()) { continue; } - mogoMarker.setAlpha( alpha ); + mogoMarker.setAlpha(alpha); + + if (alpha == 1) { + try { + Point point = MarkerServiceHandler.getMapUIController().getLocationPointInScreen(mogoMarker.getPosition()); + point.y -= WindowUtils.dip2px(mContext, 100f); + MogoLatLng targetMogoLatLng = MarkerServiceHandler.getMapUIController().getLocationMogoLatLngInScreen(point); + LatLng target = ObjectUtils.fromMogo2(targetMogoLatLng); + //使用TranslateAnimation,填写一个需要移动的目标点 + Animation animation = new TranslateAnimation(target); + animation.setInterpolator(new Interpolator() { + @Override + public float getInterpolation(float input) { + if (input <= 0.5) { + return (float) (0.5f - 2.0 * (0.5 - input) * (0.5 - input)); + } else { + return (float) (0.5f - Math.sqrt((double) ((input - 0.5f) * (1.5f - input)))); + } + } + }); + //整个移动所需要的时间 + animation.setDuration(1000); + //设置动画 + if (mogoMarker instanceof AMapMarkerWrapper) { + ((AMapMarkerWrapper) mogoMarker).getMarker().setAnimation(animation); + ((AMapMarkerWrapper) mogoMarker).getMarker().startAnimation(); + } + } catch (Exception e) { + Logger.e(TAG, e, "error."); + } + } } } @@ -475,7 +512,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, IMogoOnMessag options.icon(markerView.getView()); IMogoMarker marker = MarkerServiceHandler.getMarkerManager().addMarker(markerShowEntity.getMarkerType(), options); - markerView.setMarker( marker ); + markerView.setMarker(marker); marker.setOnMarkerClickListener(this); return marker; } else {