Android中用高德地图实现轨迹回放

效果

Android中用高德地图实现轨迹回放_第1张图片

思路

  • 网络数据拉取初始化数据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相互之间发送消息。具体流程我给张图,看看应该明白。
    Android中用高德地图实现轨迹回放_第2张图片

代码

根据上面的图示,将各个部分的代码贴出来。

画线

   /**
     * 画线
     */
    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();
	                    }
	
	                }
	            });

你可能感兴趣的:(android,基础知识点)