Android中用高德地图实现轨迹回放
程序员文章站
2022-07-13 15:17:41
...
效果
思路
-
网络数据拉取初始化数据List
定义数据格式,Key:时间 + Value:经纬度。 -
初始化SeekBar
刻度setMax为数据List的size,为什么要这么做?见下一步。 -
初始化SeekBar的Listener
onProgressChange的时候,拿到progress,用这个progeress作为position去数据集合里取数据,取出来的数据中再取出其中经纬度,放在一个全局的经纬度集合里,这里全局的经纬度集合是啥?使我们画线的核心集合,后头细说。(因为上一步我们Seekbar的Max是数据的size,所以progress对应的就是数据List里的position)。 -
画线与全局集合的维护
这个功能的核心就是俩点,一个api的调用,一个是这个api所依赖的参数—全局经纬度数据集合的维护。
PolylineOptions polylineOptions = new PolylineOptions()
.addAll(mLatLngPathList)
.color(Color.rgb(9, 129, 240)).width(6.0f);
mLastPolyline = aMap.addPolyline(polylineOptions);
- 由于本例是播放器类型的设计,所以还需要一个flag来标识暂停与播放
-
自动播放这个设计是通过播放按钮触发,然后2个handler相互之间发送消息。具体流程我给张图,看看应该明白。
代码
根据上面的图示,将各个部分的代码贴出来。
画线
/**
* 画线
*/
private void drawLine() {
//清除
if (null != mLastPolyline) {
mLastPolyline.remove();
}
// 增加起点结束
if (mLatLngPathList.size() > 1) {
PolylineOptions polylineOptions = new PolylineOptions()
.addAll(mLatLngPathList)
.color(Color.rgb(9, 129, 240)).width(6.0f);
mLastPolyline = aMap.addPolyline(polylineOptions);
}
Log.e("轨迹回放", "mLatLngPathList.size() == " + mLatLngPathList.size());
}
点击播放按钮的时候,刻度条动
...Click(new View.OnClickListener() {
@Override
public void onClick(View view) {
......
boolean isPlay = (boolean) view.getTag();
if (isPlay) {
//暂停标志位
mIsPause = true;
} else {
//拿到seekBar
SeekBar seekBar = mCarErrorWindow.getSeekBar();
if (null != seekBar) {
int progress = seekBar.getProgress();
int max = seekBar.getMax();
if (progress == max) {
seekBar.setProgress(0);
}
}
//播放
mIsPause = false;
//将地图调整到合适的比例尺
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLngList.get(0), 4));
//timer启动
timer.postDelayed(mTimerRunnable, 10);
}
......
}
});
mPlayHandler
public Handler timer = new Handler();//定时器
private Handler mPlayHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
...
handlePlay(msg, "PeopleErrorWindow");
...
}
};
handlePlay方法
/**
* 处理播放
*
* @param msg
* @param tag
*/
private void handlePlay(Message msg, final String tag) {
SeekBar seekBar = null;
seekBar = mCarErrorWindow.getSeekBar();
if (null != seekBar) {
if (msg.what == 1) {
int curPro = mCarErrorWindow.getSeekBar().getProgress();
if (curPro != mCarErrorWindow.getSeekBar().getMax()) {
mCarErrorWindow.getSeekBar().setProgress(curPro + 1);
timer.postDelayed(mTimerRunnable, stepTimeUnit / mPlaySpeedWeight);// 延迟1秒后继续执行
} else {
// Button button = (Button) findViewById(R.id.btn_replay);
// button.setText(" 回放 ");// 已执行到最后一个坐标 停止任务
}
}
}
break;
}
注册progressbar监听器
new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean bFlag) {
mLatLngPathList.clear();
if (progress != 0) {
if (progress == seekBar.getMax()) {
resetSeekBar(seekBar);
return;
}
for (int i = 0; i <= seekBar.getProgress(); i++) {
if (i < mLatLngList.size()) {
LatLng latLng = mLatLngList.get(i);
if (null != latLng) {
mLatLngPathList.add(latLng);
}
}
}
drawLine();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (progress < mDateList.size()) {
mCarErrorWindow.setTextShow(mDateList.get(progress));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mLatLngPathList.clear();
int current = seekBar.getProgress();
if (current != 0) {
for (int i = 0; i < seekBar.getProgress(); i++) {
if (i < mLatLngList.size()) {
LatLng latLng = mLatLngList.get(i);
if (null != latLng) {
mLatLngPathList.add(latLng);
}
}
}
drawLine();
}
}
});
推荐阅读