安卓關於在百度地圖上實現軌跡回放的處理

一、需求

  爲了把一個人一段時間內的歷史軌跡在地圖上描繪出來,並實現按時間順序回放。

二、嘮叨

關於描點和描線,百度地圖都有自己的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;
			}
		}
	};

最後,無圖無真相啊,上圖;










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章