百度地圖中的事件
阿新 • • 發佈:2019-02-19
寫這篇文字我想了很久(主要是怕自己能力有限誤導大家)
因為本人是一個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;
}
}
呵呵 分享給大家三段經典的程式碼(儘管大家都不能直接匯入到工程 但是希望能夠藉此來激發大家的無限創意)