1. 程式人生 > >android 百度地圖marker 設定錨點 讓圖示的下方尖尖指向實際位置

android 百度地圖marker 設定錨點 讓圖示的下方尖尖指向實際位置

標註概述

標註(Marker)是用來表示一個點位置的可見元素,每個標註自身都包含地理資訊。比如你在西單商場位置添加了一個標註,不論地圖移動、縮放,標註都會跟隨一起移動,保證其始終指向正確的地理位置。

從上面的圖可以看出,不論地圖如何變化標註始終指向“西單商場”的位置。

如何知道某個點的座標?

上例中我們在西單商場位置添加了一個標註,那麼我是如何知道它的座標點呢?可以通過API的事件機制來獲取:

  1. map.addEventListener('click', function(e){  
  2. console.log(e.point);  
  3. }); 

我們在map物件上添加了一個click事件的監聽函式,當點選地圖上某個位置時,監聽函式通過控制檯把當前點選的位置輸出出來(注意需要有控制檯的支援,比如firebug,如果沒有控制檯則可使用alert把point的lng和lat屬性輸出出來)。此外,你也可以使用API提供的座標拾取工具來完成(http://dev.baidu.com/wiki/static/map/API/tool/getPoint/),它支援檢索並且點選地圖上任意位置時會出現該位置的座標。

標註元素組成

從DOM元素構成角度看,一個完整的標註是由以下幾個部分組成的:

標註點選區域

標註圖示

標註陰影

下面是示意圖:

在地圖API實現中,這三個DOM元素分別位於不同的容器中,這些容器可以通過map.getPanes()方法獲得,其中markerMouseTarget就是標註點選區域所在容器、markerPane為標註圖示所在容器,markerShadow為標註陰影所在圖層。你可能會在自定義覆蓋物時需要這些容器物件,這裡只需要知道Marker的各個部分是如何放置的即可。

自定義標註圖示

標註的圖示是可以自定義的,通過Icon類可以自定義標註的圖示,比如我希望使用下面這個圖片作為標註圖示:

已知這個圖示大小為20x32。我們初始化地圖,接著定義Icon,並賦給一個Marker例項:

  1. varmap =newBMap.Map('container');  
  2. map.centerAndZoom(newBMap.Point(116.380797, 39.918497), 18);  
  3. var icon = new BMap.Icon('pin.png'new BMap.Size(20, 32), {  
  4. anchor: new BMap.Size(10, 30)  
  5. });varmkr =newBMap.Marker(newBMap.Point(116.38075,39.918986), {  
  6. icon: icon  
  7. });  
  8. map.addOverlay(mkr); 

我們給定icon所需圖片的url,接著是圖片的尺寸,另外我們還增加了anchor屬性,這個是幹什麼用的呢?在自定義標註圖示時有一點需要注意的就是標註的定位點(anchor),通俗的講就是要指定圖片的哪個位置是與標註真正的位置對應在一起。我們通過下面的圖示來說明:

我們獲取到地圖上一個位置(上圖中標註下端所在的黑色小方塊),那麼我也希望我標註中間下端指向這個位置,這個就需要通過anchor來調節。anchor的意義如下圖所示:

即定位點距離圖片左上角的偏移量。

如果不給anchor的話,API會自動獲取圖片中心點作為anchor位置:

我們看到標註圖片中心的位置覆蓋在那個小方塊區域。

除了anchor之外,還有一個infoWindowAnchor屬性,它是用來控制資訊視窗開啟的位置的(注意這裡呼叫的是Marker的openInfoWindow方法,而不是Map的openInfoWindow方法),預設情況下它和icon的anchor是一個位置:

標註被InfoWindow的底角擋住了,通過infoWindowAnchor屬性就可以改變開啟位置:

  1. varicon =newBMap.Icon('pin.png', newBMap.Size(20, 32), {  
  2. anchor: newBMap.Size(10, 30),  
  3. infoWindowAnchor: newBMap.Size(10, 0)  
  4. }) 

再看看效果:

尖角位置已經發生了改變。

標註拖拽

標註支援拖拽,並且可以配置是否有動畫效果,我們修改建立標註的程式碼:

  1. varmkr =newBMap.Marker(newBMap.Point(116.38075,39.918986), {  
  2. icon: icon,  
  3. enableDragging: true,  
  4. raiseOnDrag: true}); 

這裡開啟了拖拽功能以及響應的動畫效果。如果此時拖拽地圖你會得到如下效果:

通過監聽標註的dragend事件,你可以知道拖拽結束後標註的地理位置:

  1. mkr.addEventListener('dragend', function(e){  
  2. alert(e.point.lng +', '+e.point.lat);  
  3. }) 

標註陰影

為了增加立體感,可以單獨給標註新增陰影,當然你也可以把陰影直接畫在icon所用的圖片上,但是由於陰影和標註本身在一起,所以就不建議使用任何動畫效果,否則會缺乏真實感。陰影可以通過MarkerOptions的shadow屬性配置,型別也是一個Icon例項。具體使用方法和icon屬性一樣,這裡就不贅述了。

自己加的:

百度地圖的"我的位置",是不支援使用錨點的,如果也要實現這種尖尖指向實際位置的話,那就用普通的marker來代替.再每一次接收到位置時,都先要移除上一個"我的位置"的錨點,然後將新位置設定上去(一家之見,不喜勿噴..)

相關推薦

android 地圖marker 設定 圖示下方指向實際位置

標註概述 標註(Marker)是用來表示一個點位置的可見元素,每個標註自身都包含地理資訊。比如你在西單商場位置添加了一個標註,不論地圖移動、縮放,標註都會跟隨一起移動,保證其始終指向正確的地理位置。 從上面的圖可以看出,不論地圖如何變化標註始終指向“西單商場”的位

android 地圖 marker設定忽明忽暗閃爍

說下思路  百度地圖設定marker的時候可以這是icon和icons 思路就是設定幾個不同透明度的相同的圖片的bitmap作為icons 話不多說 直接上碼 1。這是核心程式碼 //閃爍點 bb

Android地圖3.0.0Marker彈出覆蓋物

最近在學習百度地圖,發現百度地圖更新後,好多東西都改變了,ItemizedOverlay<OverlayItem>這個類更是找不到了。於是自己查了下最新的文件,發現彈窗效果百度提供InfoWindow來實現。 InfoWindow(v, LatLng, list

Android 地圖間接實現Marker選背景變化效果

最近專案中有需要對百度地圖Marker設定點選效果, 最開始構思使用xml佈局檔案View view = View.inflate(this, R.layout.activity_b, null); B

Android地圖預設位置中心設定

//初始化地圖     MapView mMapView = (MapView) findViewById(R.id.map); BaiduMap mBaidumap = mMapView.getMap(); //設定中心點座標          LatLng cenpt

Android 地圖自定義地圖覆蓋物(Marker

  理論和高德地圖一模一樣,換個sdk而已,換湯不換藥,詳情可以參考上一篇高德地圖https://blog.csdn.net/Crystal_xing/article/details/84314359,下面只給出核心程式碼:   //自定義佈局 Vie

Android 地圖如何所有的Marker都顯示在螢幕範圍內。

前言:        高德地圖有方法直接呼叫就可以,總結下百度地圖的(直接複製就可以) 程式碼: LatLngBounds.Builder builder = new LatLngBounds.B

android 地圖系列之新增覆蓋物和覆蓋物的選事件

之前講了百度地圖定位和地圖基本操作,這篇部落格講一下,怎麼去給地圖新增覆蓋物,並當點選覆蓋物的時候顯示詳細資訊。 要給地圖新增覆蓋物,首先需要覆蓋物的經緯度,如果還要實現點選事件,顯示詳細的資訊,還需要覆蓋物的描述資訊(如圖片,位置名稱等),所以先新建一個實體

地圖marker標記即行車路線規劃和marker選氣泡事件

上一篇,之前的定位什麼的就不在說了,我們可以做個簡單的demo,點選地圖任意位置新增標記marker,並且根據,我們定位的位置為起點stNode,和marker標記即我們點選的位置即enNode,進行自動路線規劃,橙色程式碼位置為新增marker如果你只需要marker標

android 地圖SDK 獲取手機附近POI興趣列表 (過時)

文章內容已經過時~大家去百度官方api學習。 http://developer.baidu.com/map/ http://lbsyun.baidu.com/sdk/download 功能描述:獲取手機自身附近的興趣點(Poi, 之後使用Poi表示興趣點)列表,顯示

Android地圖(三):地圖畫運動軌跡及圖層選事件處理

上篇文章講述瞭如何在地圖顯示位置點,這篇文章主要講述如何在地圖上畫運動軌跡,以及地圖圖層點選事件的處理。 很多運動類的app都有畫出跑步者運動軌跡的需求,拿咕咚來說,我們看一下它的效果圖: 咕咚運動軌跡圖 本篇將要實現的效果 1.跑步結束後,靜態的畫出整個運動

Android 地圖 SDK v3.0.0 (三) 新增覆蓋物Marker與InfoWindow的使用

上篇部落格已經實現了地圖的定位以及結合了方向感測器使用者路痴定位方向,如果你還不清楚,請檢視:Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向感測器,本章會教大家如何新增覆蓋物,實現周邊搜尋,以及對覆蓋物的點擊出現介紹等效果。效果圖:我們的需求是,當用戶

android 地圖API 使用Marker和InfoWindow

/** * 根據手錶的經緯度在地圖上設定位置,更新頂部的位置文字描述 */ private void updateLocation(ArrayList<GPSBean> list) { /** * 1. 新使用者預設顯示地址

Android地圖聚合功能

在百度地圖的開發說明中有描述到點聚合功能: 點聚合功能 自v3.6.0版本起,新增點聚合功能,可通過縮小地圖層級,將定義範圍內的多個標註點,聚合顯示成一個標註點,並在MarkerClusterDemo中開放原始碼,方便開發者自行修改。   // 初始化點聚合管理

Android 地圖 動態畫多邊形,並判斷一個是否在多邊形內部

由於專案的需求,需要動態的在地圖上畫出多邊形,並且需要判斷一個點是否在多邊形的範圍內,根據官方的demo,結合網上的查的資料,做出的效果如下圖所示: 思路就是: 1.點選地圖增加marker; 2.拿到marker,根據marker來

Android 地圖使幾始終在合適的螢幕範圍內顯示

專案中整合百度地圖,需要使幾點的位置在螢幕範圍內顯示,剛開始使用的方放是 MapStatusUpdate mapStatusUpdate1 = MapStatusUpdateFactory.zoomTo(18.0f); mBaiduMap.setMapStatus(mapS

Android 地圖sdk 標註圖marker中可以切換顯示不同內容

記錄一個前段時間解決的功能需求 先直接上圖片看看實現後的效果: 具體需求為,在地圖頁上顯示出所有的場站marker之後,點選左側的按鈕可以實現動態切換場站marker中顯示的資料。 實現思路為:構造marker時,icon方法中傳入的引數Bit

Android 地圖新增自定義marker(覆蓋物)不顯示圖片的解決方法

在使用百度地圖新增自定義Marker View時,顯示不出來自定義marker view裡面的頭像,百度地圖的新增自定義marker顯示網路圖片本身就是一個坑(我是這樣認為的)... 我的需求是這樣的,當有人員上報位置時,就根據經緯度把人員位置資訊用自定義Marker去載入

地圖Marker 縮放圖示移動問題

1.首先你要知道marker在地圖上是在一個圖層上的,與地圖是無關的,就像在手機屏一樣,你的marker是放在外屏上的,不論你怎麼操作內屏的內容,與外屏上的裂紋是無關的。在百度地圖中Marker點最下方不是尖頭的會出現在地圖放大縮小時 感覺Marker好像定位點是會變的,據我

Android 地圖新增標記+定位+導航(從定位點開始導航到自己新增的

百度地圖的官方文件說的不是很清楚,我自己花幾天做了一個是新增標籤+定位+導航啊。僅供參考。 一.普通地圖,定位,新增標記,初始化導航SDK package com.example.salesman; import java.lang.reflect.Method; imp