android中实现百度地图的轨迹回放,安卓关于在百度地图上实现轨迹回放的处理...

本文介绍了一种在地图上实现历史轨迹回放的方法,通过遍历轨迹点列表,更新每个点的标记并刷新地图视图来实现动画效果。代码中使用了一个线程来控制播放,同时提供了播放和暂停的UI处理。在处理过程中,涉及到百度地图API、自定义标记以及动画帧间的延迟处理。
摘要由CSDN通过智能技术生成

一、需求

为了把一个人一段时间内的历史轨迹在地图上描绘出来,并实现按时间顺序回放。

二、唠叨

关于描点和描线,百度地图都有自己的API,大家都应该会了;至于播放动画,肯定不止一种方法,如果大家有好的方法,分享出来,小弟感激不尽。

三、说明

我的方法是:在一个线程里,开始播放后,遍历存放item的list,找到当前的item,移除他的marker,然后给他换一个marker,再添加到list里面,然后睡眠;接着就判断,如果不是当前item,该什么样子就什么样子,如此迭代就可以了。

小弟菜鸟一枚,代码质量不高,高手勿喷,谢谢。

主要的片段如下:

1、主要的逻辑

/** 轨迹回放逻辑处理 **/

private Runnable rz = new Runnable()

{

@Override

public synchronized void run()

{

while (isStartRun)

{

for (int i = index; i < mGeoList.size(); i++)

{

OverlayItem item = mGeoList.get(i);

flag = index;

sendMsg(MapApplication.LOCATEOVER_NOTICE_ADAPTER);

mOverlayGraphic.removeItem(item);

item.setMarker(res.get(3));

if (!isBcak)

{

break;

}

mOverlayGraphic.addItem(item);

mMapView.refresh();

SystemUtils.sleep(1000);

mOverlayGraphic.removeItem(item);

if (index == 0)

{

item.setMarker(res.get(1));

}

else if (index == mGeoList.size() - 1)

{

item.setMarker(res.get(2));

isStartRun = false;

isFinish = false;

}

else

{

View view = mInflater.inflate(R.layout.overlay_item, null);

TextView userItemTv1 = (TextView) view.findViewById(R.id.item_tv1);

userItemTv1.setText(index + 1 + "");

Bitmap bmp = userLocateUtil.createNewBitmap(view);

Drawable drawable = new BitmapDrawable(bmp);

item.setMarker(drawable);

}

if (!isBcak)

{

break;

}

mOverlayGraphic.addItem(item);

mMapView.refresh();

index++;

if (!isFinish)

{

index = 0;

sendMsg(MapApplication.LOCATEOVER_PLAY_FINISH);

break;

}

}

}

}

};

2、操作处理

/** 轨迹回放 **/

private void playTrajectory()

{

play.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

if (!"开始回放".equals(play.getText().toString()))

{

isStartRun = false;

isBcak = false;

play.setText("开始回放");

}

else

{

play.setText("暂停回放");

isFinish = true;

isStartRun = true;

isBcak = true;

thread = new Thread(rz);

if (!thread.isAlive())

{

thread.start();

}

}

}

});

}

3.UI处理

private Handler handler = new Handler()

{

public void handleMessage(Message msg)

{

switch (msg.what)

{

case MapApplication.LOCATEOVER_CHANGE_MAPVIEW:

changeMapView();

break;

case MapApplication.LOCATE_MAPVIEW_REFRESH:

mMapView.refresh();

mMapView.getController().zoomToSpan(mOverlayGraphic.getLatSpanE6(), mOverlayGraphic.getLonSpanE6());

mMapView.getController().setCenter(mOverlayGraphic.getCenter());

PocProgressDialog.cancel();

break;

case MapApplication.LOCATEOVER_PLAY_FINISH:

Toast.makeText(MainActivity.mainActivity, "播放完毕", Toast.LENGTH_SHORT).show();

flag = 99999;

adapter.notifyDataSetChanged();

play.setText("开始回放");

break;

case MapApplication.LOCATEOVER_NOTICE_ADAPTER:

adapter.notifyDataSetChanged();

// mListView.setSelection(flag);备用

break;

}

}

};

最后,无图无真相啊,上图;

b7fea48d143c681af18a2a24508ff57b.png

80bca8b0364c89c6c00e76a881ce0d0f.png

3dfeb90b11a1339e2ef5ea501ddde3f6.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值