1. 程式人生 > >百度地圖中的事件

百度地圖中的事件

寫這篇文字我想了很久(主要是怕自己能力有限誤導大家)

因為本人是一個android才學習不到一個月的菜鳥  --呵呵

其實關於百度地圖的介紹  在百度開發者裡面都介紹的很詳細了(建議大家多看看 多看幾遍)

我在這裡只不過是在百度地圖的基礎上  加上自己的一些學習感悟

百度地圖中的一共有7類

1.一般監聽事件MKGeneralListener 主要用在 BMapManager的初始化中

2.地圖監聽事件MKMapTouchListener(上一個例子有用到,這裡就不講了 這個可以實現截圖(在我的工程中 使用這個我們實現了我的足跡到新浪微博的分享))

3.雲檢索事件(其本質是傳送個百度伺服器一共http命令,然後百度伺服器給你返回一共JSON格式的資料  只不過百度把這個過程封裝到她的雲檢索SDK中了 這樣更加的方便開發者使用  其實我們完全可以直接動手寫http和JSON的解析--其實我在自己的工程使用LBS雲 確實也是自己寫的 因為我要在android客服端為雲上建立資料 但是百度沒有相關的呼叫  所以沒辦法  只有自己動手寫了  其實寫完了感覺也不復雜)

4.地圖點選事件(單擊 雙擊 長按)

5.離線地圖事件(這個自己還沒弄過)

6.彈出視窗事件(pop事件)(這個很有用 用好了可以實現很多強大的功能 *重點)

7.搜尋事件(本質和雲檢索一樣)

對於第二個事件 分享一端自己工程中的可以分享到新浪微博的程式碼(這段程式碼大家不能直接匯入工程 因為分享到新浪微博還要做很多事件(比如取得新浪的認證 封裝新浪的分享函式到自己的工程) 我這個自己給大家提示思路  希望大家能夠有更好的創意)

	MKMapViewListener mapListener = new MKMapViewListener() {

		@Override
		public void onMapMoveFinish() {

		}

		@Override
		public void onMapAnimationFinish() {

		}

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onGetCurrentMap(Bitmap arg0) {
			progress.setVisibility(View.GONE);
			final Bitmap bitmap = arg0;
			handler.post(new Runnable() {
				
				@Override
				public void run() {
					try{
						SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
						String date = sDateFormat.format(new java.util.Date());
						//Environment.getExternalStorageDirectory() + "/DCIM/Camera");
						final String path = Environment.getExternalStorageDirectory() + 
								"/DCIM/Camera/路線" + date + ".jpeg";
						// 截圖檔案儲存路徑
						File photodir = new File(path);
						FileOutputStream fout;
						if (photodir.exists()) {
							photodir.delete();
						}
						try {
							photodir.createNewFile();
							fout = new FileOutputStream(photodir);
							bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
							fout.flush();
							fout.close();
						} catch (Exception e) {
							Toast.makeText(MainActivity.this, e.getMessage(),Toast.LENGTH_LONG).show();
						}
						new AlertDialog.Builder(MainActivity.this)
								.setTitle("截圖成功,分享給好友?")
								.setPositiveButton("分享",
									new DialogInterface.OnClickListener() {
										@Override
										public void onClick(DialogInterface dialog,
												int which) {
											// 跳轉到新浪微博或其他的分享介面
											// 圖片路徑在變數path裡
											Intent sendfilepath = new Intent(MainActivity.this,
													PhotoWeiboActivity.class);
											sendfilepath.putExtra("picPath", path);//picPath為所要分享的圖片存放路徑,“picPath”不用改。
											startActivity(sendfilepath);
		
										}
									}).setNegativeButton("暫不分享!", null)
									.show();
					
					}
					catch(Exception e){
						Toast.makeText(getApplicationContext(), "截圖出錯了", Toast.LENGTH_SHORT).show();
					}
				}
			});
		}

		@Override
		public void onClickMapPoi(MapPoi arg0) {

		}
	};

彈出視窗事件我在分享一端程式碼(這段程式碼很有價值,希望大家認真領悟)
		// 彈出泡泡圖層
		PopupOverlay pop = new PopupOverlay(mapView, new PopupClickListener() {

			@Override
			public void onClickedPopup(int arg0) {
				// Toast.makeText(getApplicationContext(),
				// "跳轉到通話記錄",Toast.LENGTH_SHORT).show();
				if (Type == 3) {// 群組跳轉
					Intent intent = new Intent(MainActivity.this,
							TeamChatActivity.class);
					Bundle bundle = new Bundle();
					bundle.putString("teamId", tag);
					bundle.putString("teamName", tag);
					intent.putExtras(bundle); 
					startActivity(intent);

				} else if (Type == 1) {
					Intent intent = new Intent(MainActivity.this,
							ChatActivity.class);
					Bundle bundle = new Bundle();
					bundle.putString("id", opid);
					bundle.putString("chat_name", name);
					intent.putExtras(bundle);
					startActivity(intent);
				}
			}
		});
		TextView popupText = null;// 泡泡view
		View viewCache = null;
		// 處理點選事件,彈出泡泡
		mapView.getOverlays().remove(pop);

		LayoutInflater factory = LayoutInflater.from(MainActivity.this);
		// 獲得自定義的對話方塊
		viewCache = factory.inflate(R.layout.marker_pop, null);

		popupText = (TextView) viewCache.findViewById(R.id.text_pop);
		popupText.setBackgroundResource(R.drawable.popup);

		if (str.length() >= 35) {
			str = str.substring(0, 35) + "…";
		}
		popupText.setText(str);
		pop.showPopup(BMapUtil.getBitmapFromView(popupText), ptstart, 8);

	

最後分享一段我最自豪的程式碼(這段程式碼是我想破了腦子才實現的  自豪啊)
	class listoverlay extends ItemizedOverlay<OverlayItem> {
		// 用MapView構造ItemizedOverlay
		public listoverlay(Drawable mark, MapView mapView) {
			super(mark, mapView);
		}

		protected boolean onTap(int index) {
			// Toast.makeText(getApplicationContext(), "ontap",
			// Toast.LENGTH_SHORT).show();
			// 在此處理item點選事件
			if (index >= perlist.size()||kkkkk>1) {
				// 點選自己位置marker,不做任何處理
				return false;
			}
			current = index;
			otherinfo(perlist.get(current));
			return true;
		}

		public boolean onTap(GeoPoint pt, MapView mapView) {
			// 在此處理MapView的點選事件,當返回 true時
			PopupOverlay pop = new PopupOverlay(mapView, null);
			mapView.getOverlays().remove(pop);
			
			final ArrayList<person>plistList=new ArrayList<person>();
			List<String> listName = new ArrayList<String>(); // 儲存在一定範圍內的人名
			
			int x = pt.getLatitudeE6();
			int y = pt.getLongitudeE6();
			Point point = mapView.getProjection().toPixels(new GeoPoint(x, y), null);
			x = point.x;
			y = point.y;
//			int x = (int)event.getX();
//			int y = (int)event.getY();
			Projection p=mapView.getProjection();
			for (int i = 0; i <perlist.size(); i++) {
				Point sp=p.toPixels(new GeoPoint((int)(perlist.get(i).getLatitude()*1e6), (int)(perlist.get(i).getLongitude()*1e6)),null);
				Double dis = Math.sqrt((sp.x-x)*(sp.x-x)+(sp.y-y)*(sp.y-y));
				
				if (dis <= 25){ // 距離小於10畫素
					//顯示到listview裡面
					plistList.add(perlist.get(i));
					listName.add(perlist.get(i).getNameString());
				}				
			}
			
			final String[] addrs = listName.toArray(new String[0]);
			if(addrs.length > 1){
				kkkkk=2;
				AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
					.setTitle("可能要找的人")
					.setItems(addrs, new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							person pon = plistList.get(which);
							if(pon.getId() == per.getId()){
								myinfo(pon);
							}
							else{
								otherinfo(pon);
							}
						}
					})
					.create();
				dialog.show();
			}
			else{
				kkkkk=1;

			}
			
			super.onTap(pt, mapView);
			return false;
		}
	}

呵呵  分享給大家三段經典的程式碼(儘管大家都不能直接匯入到工程 但是希望能夠藉此來激發大家的無限創意)