高德地图 Marker 按照轨迹移动
sdk 5.0.0 版本参见 branch map-5.0.0
- Android 动画轨迹平滑处理
- SDk 视图外动画
第一步,添加依赖
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.xesam:MoveMarker:0.1'
}
第二步,添加相应的高德 SDk .jar 以及 .so 。
第三步,代码调用
在具体的工程中可以使用单个 marker 或者管理单个 marker。具体参见 demo https://github.com/xesam/MoveMarker
MarkerOptions options = new MarkerOptions()
.title("移动1")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.car))
.snippet("详细信息")
.anchor(0.5f, 0.5f)
.position(latLng);
MoveMarker<Bus> moveMarker = new MoveMarker<>(mAMap, mAMap.addMarker(options));
moveMarker.setData(data);
moveMarker.setTotalDuration(5_000);
moveMarker.setMovePoints(points);
moveMarker.startMove();
或者
public class BusMoveMgr extends AbsMoveMgr<Bus> {
public BusMoveMgr(AMap map) {
super(map);
}
@Override
protected String getKey(Bus item) {
return item.id;
}
@Override
protected MoveMarker<Bus> onMarkerAdded(Bus bus) {
//根据 bus 创建marker
return new MoveMarker<>(mAMap, mAMap.addMarker(options));
}
@Override
protected void onMarkerUpdated(MoveMarker<Bus> moveMarker, Bus updated) {
//marker 有更新
}
@Override
protected void onMarkerLost(final MoveMarker<Bus> moveMarker) {
//对应的 marker 丢失
moveMarker.getMarker().remove();
}
}
高德 SDk 提供了基于 glAnimation 的 4 种动画: TranslateAnimation, AlphaAnimation, ScaleAnimation, RotateAnimation, 不过这 4 种动画都有以下问题(当前是 4.1.3 版本):
- Marker Animation 如果带有 InfoWindow,InfoWindow 的移动会有延迟。
- Marker Animation 的缺陷,不在视界内,并且没有设置 showInfoWindow() 的时候(此时 Marker 已经被移除了),Animation 就不会执行。
- 无法停止 Marker 的 Animation。
不过高德方面回复会在新版本解决这些问题,暂用解决办法(在 Marker 不可见的时候,已然有bug):
- (sdk 4.1.3 已修正)。
- 不要相信 AnimationListener#onAnimationEnd 回调,使用一个与动画时长相等的 delay message 来修正最终的位置。(sdk 5.0.0 已修正)
- 想停止动画的时候,发起一个时间非常短(比如 10 ms)的动画来冲掉正在执行的动画。
或者完全不要使用 SDK 提供的各种 Animation, 使用 Android 自身的动画机制,不过需要对轨迹作平滑处理。
高德地图的论坛太不给力了,有问题还是 Github 去提 issues 吧。